12

我的应用程序有问题,我试着举例说明,我有一个表单,这个表单存在几个文本框和下拉列表。为了可重用性,我将 3 个下拉列表合并到一个局部视图中,这个局部视图我用 @Html.Action 加载,这工作正常,当我启动表单时,我看到一切都按原样显示,虽然我不知道为什么但那些需要下拉列表直接以红色开头显示,并表示它是必填字段。

但是当我填写所有内容并从下拉列表中选择值并单击“确定”时,下拉列表中的值是 NULL。

我认为通过代码示例会更容易理解:

主要型号:

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; } 
}

这是位置类,然后传递给局部视图,通常我认为应该设置,它看起来像这样:

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; }
  }

现在我们有了该位置的局部视图:

@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>

然后我们以如下形式调用这个局部视图:

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

最后在控制器中:

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

我知道这是很多代码,但我希望你能帮助我......

4

3 回答 3

3

我认为您应该使用编辑器模板:

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

并添加部分内部~/Views/[ControllerName]/EditorTemplates/Location.cshtml~/Views/Shared/EditorTemplates/Location.cshtml

模板代码:

@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>

但是,如果您更喜欢在某个位置使用 partial (不遵循约定),您可以指定位置:

@Html.EditorFor(x => x.Location, "~/Views/SpecifyLocation/_Location.cshtml")
于 2013-05-31T05:46:25.090 回答
1

我同意 Xordal,EditorTemplates 是要走的路。非常有用的东西。我注意到缺少 SelectList 的一件事。我可能在这里遗漏了一些东西,但是您是否尝试过以下方法?:

 <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>
于 2013-06-16T16:52:04.760 回答
0

尝试Html.RenderPartial代替Html.Action

于 2013-05-25T18:51:46.190 回答