如何将数据模型传递给部分视图?

时间:2014-12-23 00:20:41

标签: asp.net-mvc razor

为了说明我面临的问题,我整理了三个简单的数据模型:

 public class PersonalModel {
     public string FirstName { get; set; }
     public string LastName { get; set; }
 }

 public class AddressModel {
     public string Street { get; set; }
 }

 public class OverallModel {
    public string Id { get; set; }
    public PersonalModel Personal { get; set; }
    public AddressModel Address { get; set; }
 }

这是我简单的Index.chtml:

@model WebAppTest.Models.OverallModel
@using (Html.BeginForm())
{
  @Html.AntiForgeryToken()

  <div class="form-horizontal">
    <h4>OverallModel</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.Id)

    <div>
        @Html.Partial("Personal", Model.Personal)
    </div>
    <div>
        @Html.Partial("Address", Model.Address)
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>
  </div>
}

当&#34; Save&#34;单击按钮,将调用以下控制器方法:

[HttpPost]
public ActionResult Index(OverallModel model) {
    return View(model);
}

我遇到的问题是model.Personalmodel.Address值在控制器方法中始终显示为null。

虽然这些值正确传递给局部视图,但是当单击提交时,Razor引擎无法将整个对象重新组合在一起。

如果你能告诉我我失踪的是什么,我将不胜感激。问候。

2 个答案:

答案 0 :(得分:8)

OverallModel传递给您的部分,以便正确命名控件以便回发到OverallModel。目前,您将拥有name="FirstName"的控件,但它们必须为name="Personal.FirstName"

@Html.Partial("Personal", Model)

并将部分更改为适合

@model OverallModel
....
@Html.TextBoxFor(m => m.Personal.FirstName)

作为替代方案,您也可以将前缀传递给部分

@Html.Partial("Address", Model.Personal, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "Personal" }})

答案 1 :(得分:0)

我遇到了和你一样的问题,所以我会把这2美分放在这里给同样的问题。

我的解决方案是使用EditorTemplates。

你创建模型又名个人,地址,总体。

在(放置任何名称)控制器中,您可以创建Overal模型的实例,并在Get方法中将其发送到View中,在Post方法中将其作为传入参数。

 public ActionResult Index()
    {
        var model = new OveralModel();

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(OveralModel model)
    {
        return View(model);
    }

索引页面(我会用你的)看起来像这样

@model EditorFor.Models.OveralModel

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>OverallModel</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(m => m.Id)

        <div>            
            @Html.EditorFor(m => m.Personal)
        </div>
        <div>
            @Html.EditorFor(m => m.Address)
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}

除了PartialViews我们可以使用EditorModels,我将它理解为PartialView,我们可以随时使用它作为编辑器。

因此,要使用它,我们在Views / Shared中创建名为EditorTemplates的文件夹,并创建与模型同名的视图。

例如,我们的PersonalModel的EditorTemplate将被称为PersonalModel.cshtml,其中的代码可能看起来像这样

@model EditorFor.Models.PersonelModel


<div class="form-group">
    @Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" })
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.LastName, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" })
    </div>
</div>

因此,当我们在我们的帖子中写@Html.EditorFor(m => m.Personal)时,它会查看EditorTemplates并搜索具有相同名称的EditorTemplate并在网站中使用它。

Index site will look like this

当您单击“提交”按钮时,它会将整个模型发送回Controller

Looks like it worked and we got our data back from view and use it for whatever we want to.

PS:我的第一篇文章,所以我希望它是可以理解的,即使现在和将来都会对其他人有所帮助。祝你有个美好的一天