2012-03-28 9 views
11

मेरे पास एक व्यू मॉडल है जिसमें उत्पाद श्रेणी का प्रकार और एक आईनेमेरेबल < उत्पाद> प्रकार शामिल है। पोस्ट पर पहली स्तर की उत्पाद वस्तु वापस व्यूमोडल से बंधी हुई है जबकि उत्पाद enum वापस शून्य आ रहा है।मॉडल देखें Inumerable <> संपत्ति पोस्ट विधि से वापस शून्य (बाध्यकारी नहीं) आ रही है?

आईन्यूमेरेबल < क्यों गर्व है> संपत्ति प्रति पोस्ट मेरे दृश्य मॉडल से बंधी नहीं है? धन्यवाद!

मॉडल:

public class Product 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
} 

public class ProductIndexViewModel 
{ 
    public Product NewProduct { get; set; } 
    public IEnumerable<Product> Products { get; set; } 
} 

public class BoringStoreContext 
{ 
     public BoringStoreContext() 
     { 
      Products = new List<Product>(); 
      Products.Add(new Product() { ID = 1, Name = "Sure", Price = (decimal)(1.10) }); 
      Products.Add(new Product() { ID = 2, Name = "Sure2", Price = (decimal)(2.10) }); 
     } 
     public List<Product> Products {get; set;} 
} 

दृश्य:

@model ProductIndexViewModel 

@using (@Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(model => model.NewProduct.Name) 
     @Html.EditorFor(model => model.NewProduct.Name) 
    </div> 
    <div> 
     @Html.LabelFor(model => model.NewProduct.Price) 
     @Html.EditorFor(model => model.NewProduct.Price) 
    </div> 
    <div> 
     <input type="submit" value="Add Product" /> 
    </div> 

     foreach (var item in Model.Products) 
     { 
     <div> 
     @Html.LabelFor(model => item.ID) 
     @Html.EditorFor(model => item.ID) 
    </div> 
    <div> 
     @Html.LabelFor(model => item.Name) 
     @Html.EditorFor(model => item.Name) 
    </div> 
    <div> 
     @Html.LabelFor(model => item.Price) 
     @Html.EditorFor(model => item.Price) 
    </div> 

     } 
     } 

नियंत्रक:

public class HomeController : Controller 
{ 
    BoringStoreContext db = new BoringStoreContext(); 

    public ActionResult Index() 
    { 
     ProductIndexViewModel viewModel = new ProductIndexViewModel 
     { 
      NewProduct = new Product(), 
      Products = db.Products 
     }; 
     return View(viewModel); 
    } 

    [HttpPost] 
    public ActionResult Index(ProductIndexViewModel viewModel) 
    { 
     // ???? viewModel.Products is NULL here 
     // ???? viewModel.NewProduct comes back fine 

     return View(); 
    } 
+0

आप अपने EditorFor अनुकूलित किया की तरह इस संपादक टेम्पलेट कॉल कर सकते हैं? – Shyju

+0

@Shyju: नमस्ते मैंने नहीं किया..मैं यह मान रहा हूं कि अगर मैं Product.cshtml के लिए एक संपादक टेम्पलेट बनाउंगा तो मैं @ HTml.EditorFor (मॉडल => मॉडल.प्रोडक्ट्स) को कॉल कर सकता हूं और यह शायद काम करेगा? – JaJ

+0

हाँ आप कर सकते हैं। मैंने उस दृष्टिकोण के साथ एक जवाब जोड़ा। – Shyju

उत्तर

14

आप अपने लैम्ब्डा अभिव्यक्ति ठीक से उपयोग नहीं कर रहे। आपको मॉडल के माध्यम से उत्पाद सूची तक पहुंचने की आवश्यकता है। प्रयास करें इस तरह यह कर:

@count = 0 
foreach (var item in Model.Products) 
    { 
    <div> 
    @Html.LabelFor(model => model.Products[count].ID) 
    @Html.EditorFor(model => model.Products[count].ID) 
</div> 
<div> 
    @Html.LabelFor(model => model.Products[count].Name) 
    @Html.EditorFor(model => model.Products[count].Name) 
</div> 
<div> 
    @Html.LabelFor(model => model.Products[count].Price) 
    @Html.EditorFor(model => model.Products[count].Price) 
</div> 
@count++ 
    } 

संपादित

नियंत्रक:

BoringStoreContext db = new BoringStoreContext(); 

    public ActionResult Index() 
    { 
     ProductIndexViewModel viewModel = new ProductIndexViewModel 
     { 
      NewProduct = new Product(), 
      Products = db.Products 
     }; 
     return View(viewModel); 
    } 

    [HttpPost] 
    public ActionResult Index(ProductIndexViewModel viewModel) 
    { 
     // work with view model 

     return View(); 
    } 

मॉडल

public class Product 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
} 

public class ProductIndexViewModel 
{ 
    public Product NewProduct { get; set; } 
    public List<Product> Products { get; set; } 
} 

public class BoringStoreContext 
{ 
    public BoringStoreContext() 
    { 
     Products = new List<Product>(); 
     Products.Add(new Product() { ID = 1, Name = "Sure", Price = (decimal)(1.10) }); 
     Products.Add(new Product() { ID = 2, Name = "Sure2", Price = (decimal)(2.10) }); 
    } 
    public List<Product> Products { get; set; } 
} 

दृश्य:

@model Models.ProductIndexViewModel 


@using (@Html.BeginForm()) 
{ 
<div> 
    @Html.LabelFor(model => model.NewProduct.Name) 
    @Html.EditorFor(model => model.NewProduct.Name) 
</div> 
<div> 
    @Html.LabelFor(model => model.NewProduct.Price) 
    @Html.EditorFor(model => model.NewProduct.Price) 
</div> 


for (int count = 0; count < Model.Products.Count; count++) 
{ 
    <div> 
    @Html.LabelFor(model => model.Products[count].ID) 
    @Html.EditorFor(model => model.Products[count].ID) 
    </div> 
    <div> 
    @Html.LabelFor(model => model.Products[count].Name) 
    @Html.EditorFor(model => model.Products[count].Name) 
    </div> 
    <div> 
    @Html.LabelFor(model => model.Products[count].Price) 
    @Html.EditorFor(model => model.Products[count].Price) 
    </div> 
} 

<div> 
    <input type="submit" value="Add Product" /> 
</div> 
} 
+1

आप लूप के लिए नियमित नकल करने के लिए फ़ोरैच लूप का उपयोग क्यों करेंगे? और आप बार-बार मॉडल क्यों कॉल करेंगे। उत्पाद [गिनती] जब आपके पास पहले से ही फ़ोरैच लूप में आइटम है? – rossisdead

+0

@Xander - धन्यवाद। हेल्पर्स वास्तव में '.' विस्तार का उपयोग करने के लिए अच्छी प्रतिक्रिया नहीं देते हैं, इसलिए 'model.Products.item.ID' इंडेक्सिंग काम नहीं करेगा। मैं समाधान से हालांकि '.item' को हटाना भूल गया था और इसे अपनी पहली टिप्पणी में आपके द्वारा टिप्पणी किए गए परिवर्तन को प्रतिबिंबित करने के लिए संपादित किया था। –

+1

@rossisdead - जैसा कि ऊपर टिप्पणी की गई है, 'model.Products.item' यहां उतना ही मान्य नहीं है जितना उपयोग करना होगा। ए 'के लिए (int count = 0; गिनती

7

Travis's answer इस मुद्दे को संबोधित करेगा। EditorTemplates

का उपयोग करके एक और तरीका यहां है, आप उत्पाद प्रदर्शित करने के लिए Editor template का उपयोग कर सकते हैं और यह ठीक काम करेगा।

1) एक दृश्य "Products" कि अंदर नामक एक फ़ोल्डर "EditorTemplates" कहा जाता है अपना विचार/होम फ़ोल्डर

2) तहत जोड़ें। उस दृश्य

@model SO_MVC.Models.Product 
@{ 
    Layout = null; 
} 
<p> 
    @Html.LabelFor(x=>x.ID) 
    @Html.EditorFor(x=>x.ID) 
</p> 
<p> 
    @Html.LabelFor(x=>x.Name) 
    @Html.EditorFor(x=>x.Name) 
</p> 
<p> 
    @Html.LabelFor(x=>x.Price) 
    @Html.EditorFor(x=>x.Price) 
</p> 
@Html.HiddenFor(x=>x.Id) 

और आपके मुख्य दृश्य में करने के लिए इस कोड जोड़ें, तो आप इस

@Html.EditorFor(m=>m.Products) 
+0

हाँ, यह भी काम करता है! बहुत बढ़िया ! – JaJ

संबंधित मुद्दे