2013-05-25 29 views
12

Tôi gặp sự cố với ứng dụng của mình, hãy thử giải thích bằng ví dụ, tôi có biểu mẫu, biểu mẫu này tồn tại một số hộp văn bản và danh sách thả xuống. Đối với reusability tôi sáp nhập 3 thả xuống danh sách vào một phần xem, này xem một phần tôi tải với @ Html.Action, điều này hoạt động ok, khi tôi bắt đầu hình thức tôi thấy mọi thứ xuất hiện như nó phải được, mặc dù tôi không biết tại sao nhưng những người yêu cầu danh sách thả xuống trực tiếp được hiển thị với bắt đầu màu đỏ và cho biết đó là trường bắt buộc.MVC 3 Thuộc tính mô hình không được đặt ở chế độ xem từng phần được gọi là html.action

Nhưng khi tôi điền mọi thứ vào và tôi chọn các giá trị từ danh sách thả xuống và tôi nhấp vào OK, giá trị từ danh sách thả xuống là NULL.

Tôi nghĩ rằng nó sẽ được comprehendable hơn với một mã ví dụ:

mô hình chi tiết:

public class FormModel 
{ 
    [Required] 
    public string UserName { get; set; } 

    [Required] 
    [Display(Name = "Birthdate")] 
    public DateTime? Birthdate { get; set; } 
    //This is what i'm talking about, that is not being set, the location 
    public Location Location { get; set; } 
} 

Đây là lớp vị trí, sau đó được thông qua để xem một phần và thường tôi nghĩ rằng nên thiết lập, nó trông như thế này:

public class Location 
{ 
    [Required] 
    [Display(Name = "Country")] 
    public string CountryId { get; set; } 

    [Required] 
    [Display(Name = "Region")] 
    public string RegionId { get; set; } 

    [Required] 
    [Display(Name = "City")] 
    public string CityId { get; set; } 
    } 

Bây giờ chúng ta có một cái nhìn cục bộ cho các vị trí:

@model TestWebsite.Models.Location 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.CountryId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.CountryId, Model.Countries, "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.CountryId) 
    </td> 
</tr> 
<!-- Region --> 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.RegionId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.RegionId, Enumerable.Empty<SelectListItem>(), "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.RegionId) 
    </td> 
</tr> 
<!-- City --> 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.CityId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.CityId, Enumerable.Empty<SelectListItem>(), "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.CityId) 
    </td> 
</tr> 

Sau đó, chúng ta gọi là xem phần này dưới các hình thức như thế này:

@Html.Action("LocationGroup", "Account", Model.Location) 

Và cuối cùng trong bộ điều khiển:

[ChildActionOnly] 
    public ActionResult LocationGroup(Location model) 
    { 
     model.Countries = GetCountries(); 
     return PartialView("_LocationView", model); 
    } 

Tôi biết điều đó là rất nhiều mã, nhưng tôi hy vọng bạn có thể giúp tôi ...

+0

** Nhưng khi tôi điền mọi thứ vào và chọn giá trị từ danh sách thả xuống, và tôi nhấp vào OK, các giá trị từ danh sách thả xuống là NULL. ** Bạn đã thử gửi các biểu mẫu với 'JQuery/JSON' hay bạn đã cố gắng thiết lập nội dung biểu mẫu bằng cách gói' Ajax.Begin'? – wwcdwdcw

+0

Bạn có thể kiểm tra tên của các thuộc tính được gửi đến máy chủ (thông qua Firebug chẳng hạn). Tôi đặt cược rằng các tên tương ứng với chế độ xem một phần của bạn không phù hợp với mô hình ở dạng tên. Vì vậy, mvc không thể để ràng buộc. – Vic

Trả lời

3

Tôi nghĩ rằng bạn nên sử dụng Editor Templates:

@model TestWebsite.Models.FormModel 
@using(Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.Location) 
    <input type="submit" value="save"/> 
} 

và thêm một phần bên trong ~/Views/[ControllerName]/EditorTemplates/Location.cshtml hoặc ~/Views/Shared/EditorTemplates/Location.cshtml

mã của mẫu:

@model TestWebsite.Models.Location 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.CountryId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.CountryId, Model.Countries, "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.CountryId) 
    </td> 
</tr> 
<!-- Region --> 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.RegionId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.RegionId, Enumerable.Empty<SelectListItem>(), "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.RegionId) 
    </td> 
</tr> 
<!-- City --> 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.CityId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.CityId, Enumerable.Empty<SelectListItem>(), "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.CityId) 
    </td> 
</tr> 

Nhưng nếu bạn muốn có một phần ở một số vị trí (không tuân theo quy ước), bạn có thể chỉ định vị trí:

@Html.EditorFor(x => x.Location, "~/Views/SpecifyLocation/_Location.cshtml") 
0

Hãy thử Html.RenderPartial thay vì Html.Action

+0

có, nó sẽ làm việc tốt hơn tôi nghĩ, nhưng tôi thà thích sử dụng hành động, tôi đọc rằng cách này là tốt hơn, như tôi cần phải cư những ddls từ cơ sở dữ liệu, tôi sẽ không cần phải làm điều đó hai lần ... – Alnedru

1

Tôi đồng ý với Xordal, EditorTemplates là con đường để đi. Những thứ vô cùng hữu ích. Một điều tôi nhận thấy sự thiếu một SelectList. Tôi có thể thiếu một số thứ ở đây, nhưng bạn đã thử những điều sau chưa ?:

<td class="editor-label"> 
    @Html.LabelFor(m => m.CountryId) 
</td> 
<td class="editor-field"> 
    @Html.DropDownListFor(m => m.CountryId, new SelectList(Model.Countries, "CountryId" , "CountryName", null)) 
</td> 
<td> 
    @Html.ValidationMessageFor(m => m.CountryId) 
</td> 
+1

Vâng, bạn nói đúng. Tôi biết về điều đó :) http://stackoverflow.com/a/12667845/1643075 Nhưng không phải là vấn đề của câu hỏi – Xordal

Các vấn đề liên quan