2011-07-08 22 views
5

Bunun ne anlama geldiğini biliyorum ve Google ile MSDN’de arama yaptım. Ama, bunun için başka nasıl geçeceğim?Bağlamsal anahtar kelime 'var' yalnızca yerel bir değişken bildiriminde görünebilir

App_Code klasöründe (WebMatrix kullanarak) tıraş kodumda bir işlev var ve veri tabanından bilgi alıyorum, bazı hesaplamalar yapın, sonra veritabanını yeni toplamla güncelleyin.

Ancak, bana izin vermezse, App_Code klasöründeki yöntemime değişkenleri nasıl iletebilirim? İşte

bende ne var:

EditQuantity.cshtml (kök klasörü):

 try 
     { 
      Base baseClass; 
      baseClass.CalculateTotalPriceInCart(Request.QueryString["PartNumber"], Request.QueryString["Description"], Session["OSFOID"], true); 

      Response.Redirect("~/Cart.cshtml"); 
     } 
     catch(Exception exmes) 
     { 
      message = exmes; 
     } 

Ve Base.cs (App_Code klasör içinde): Ben

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Text; 
using WebMatrix.Data; 

/// <summary> 
/// Summary description for ClassName 
/// </summary> 
public class Base 
{ 
    public void CalculateTotalPriceInCart(var PartNumber, var Description, var OrderId, bool IsBoxed) 
    { 
     var database = Database.Open("OSF"); 
     var query = ""; 
     var result = ""; 
     decimal price = 0.00M; 

     if(IsBoxed) 
     { 
      // Select item. 
      query = "SELECT Boxes, BoxPrice FROM Cart WHERE OrderId = '" + OrderId + "' AND PartNumber = '" + PartNumber + "' AND Description = '" + Description + "' AND IsBoxed = 1"; 
      result = database.Query(query); 

      // Recalculate Price. 
      foreach(var item in result) 
      { 
       price = result.Boxes * result.BoxPrice; 
      } 

      // Update item. 
      query = "UPDATE Cart SET BoxPrice = '" + price + "' WHERE OrderId = '" + OrderId + "' AND PartNumber = '" + PartNumber + "' AND Description = '" + Description + "' AND IsBoxed = 1"; 
      database.Execute(query); 
     } 
    } 
} 

işe yarayıp yaramadığını görmek için birkaç şey denedim, ama hayır. Açıkçası yanlış yapıyorum, ama bunu Masaüstü uygulamalarında yaptığım şey, WebPages için neden farklı olacağını anlamıyorum ve bunu yapmak için neler yaptığımı anlayamıyorum?

Teşekkür ederiz!

+2

Yan not olarak: Hazırlanmış/Parametreli ifadeler arkadaşınızdır. Gerçekten iyi bir nedeniniz olmadığı sürece, dizgi birleştirmeleriyle sorgu oluşturmayın. – CodesInChaos

cevap

5

Komut dosyası derleme zamanında yöntem imzasını belirleyemediğinden, yöntem parametrelerini var anahtar sözcüğü ile tanımlayamazsınız. Başka yorumunda

public void CalculateTotalPriceInCart(
     string Description, 
     string PartNumber, 
     string OrderId, 
     bool IsBoxed) 

bunu bir string için IEnumerable<dynamic> döküm edemeyeceğini söyledi. Yani parametreyi doğru bir şekilde bildirin! Hangisi olduğunu bilmiyorum.

public void CalculateTotalPriceInCart(
     IEnumerable<dynamic> Description, // for example 
     string PartNumber, 
     string OrderId, 
     bool IsBoxed) 
+0

Zaten bunu denedim, ancak bana bu hatayı verdi: '' String.' için 'System.Collections.Generic.IEnumerable ' türünü dolaylı olarak dönüştürebilirsiniz – bendr

+3

Güncelleme, Jase konusuna bakın. Argüman türlerinin ne olduğunu bilmemin bir yolu yok. İçeri girmeye çalıştığın şeye bakmalısın. – Amy

2

Sadece parametre listesindeki varyantları beton türleri ile değiştirin.

Yani bunun olurdu onlar dizeleri farzederek: Bir yöntem parametresinin türü olarak var kullanamaz

public void CalculateTotalPriceInCart(string PartNumber, string Description, string OrderId, bool IsBoxed)

+0

Um, Yep! Bence .. – bendr

+0

Nooope! Üzgün ​​çalışmıyor. Bunu zaten denedim ve şunu elde ettim: '' System.Collections.Generic.IEnumerable '' türünün 'string'' – bendr

+2

türüne dolaylı olarak dönüştürülemez, hangi değişken IEnumerable olarak geliyor? Aynı zamanda, kodda tek bir değer beklediği görünse de, bu değişkenler bir koleksiyon olarak geliyormuş gibi göründüğü için bu değişkenleri dolduran sorunlara sahip olabileceğiniz anlamına geliyor. Her halükarda çözüm, gelip gelenlerle eşleşen paramize gerçek tipler vermektir, ancak bundan önce, bu değişkenlerin, olduklarını düşündüğünüz türleri tuttuklarından emin olmanız gerekir. – heisenberg

2

. Gerçek bir tip olmalı (string, int, Object, vb.). var sadece bir yöntemin içinde kullanılabilir (foreach'ınızda olduğu gibi)

+0

Ben dize kullanarak çalıştı, ancak o zaman muhtemelen denedim sadece IEnumerable – bendr

+0

' bir 'örtülü dönüştürülemez türü 'System.Collections.Generic.IEnumerable ' atar, ya tür olarak dinamik kullanarak, ama aynı hata verdi –

+0

Sonra türü olarak IEnumerable kullanmalıdır string'' istisna – bendr

1

Bu sizin gerçek kodunuz mı? Bu satır derlenmemelidir bile. Hata döküm İlişkin

, deneyin:

public void CalculateTotalPriceInCart(string PartNumber, string Description, IEnumerable<dynamic> OrderId, bool IsBoxed) 

PartNumber ve Açıklama sorgu dizesi geliyor beri bu kesinlikle dize vardır ve true kesinlikle bool yani IEnumerable<dynamic> OrderId olmalı olurdu şey.

Bu, sorunu tamamen çözmez, çünkü Session["OSFOID"], değerlerin bir koleksiyonudur ve tek bir değer değildir.Eğer tek bir değerdir eminseniz, o zaman o zaman işe yaramazsa ne Oturumu içine koyarak konum senin düşündüğün gibi değil

CalculateTotalPriceInCart(Request.QueryString["PartNumber"], Request.QueryString["Description"], ((IEnumerable<string>)Session["OSFOID"]).FirstOrDefault(), true); 

deneyin.

I've tried a few things to see if it'd work, but nope. I'm obviously doing it wrong, but this is how I do it in Desktop apps, I don't get why it'd be different here for WebPages, and how shold I go about doing this?

Bu ya bir masaüstü uygulamasında işe yaramaz İlişkin

, sadece bir parametre türü olarak var tanımlayamazsınız. Size en yakın olanı, Intellisense (size derleyici ne tür olduğunu bilmediği için) vermeyecek olan dynamic'dur, ancak derleyici için bilinmeyen bir türü iletmenize ve kullanmanıza izin verir (siz gerçek türü nedir)