gpt4 book ai didi

asp.net-mvc-4 - 我可以使用局部 View 在 ASP.NET MVC 中编辑多个模型吗?

转载 作者:行者123 更新时间:2023-12-02 04:43:38 25 4
gpt4 key购买 nike

我是 ASP.NET MVC 4 的新手,我正在为一个在网络表单中很容易的概念而苦苦挣扎。那么,如果我有一个 Customer 类,并且一个 Customer 有一个 Address,我如何在同一个表单中的同一个提交操作中编辑 Customer 和 Address?我想为地址创建一个“_Edit”部分 View ,但如果地址没有提交按钮,我不知道如何连接 Controller 。我只想要一个按钮将所有模型保存在一个 View 中。

因此,我可以创建一个新的 CompanyView 模型、 View 和 Controller ,并按此方式进行。但是,如果我有许多具有地址的对象,那么继续创建 View 模型以允许您以相同的形式编辑对象和地址似乎需要做很多工作。有没有办法创建地址部分编辑 View 并以某种方式更新公司编辑 Controller 中的地址字段?或者,它是否以某种方式将 model.Address 传递回 Company Edit Controller 而不是 null?

编辑:

模型

public class Address
{
public Int32 Id { get; set; }

[Display(Name = "Address 1")]
public String Address1 { get; set; }

[Display(Name = "Address 2")]
public String Address2 { get; set; }

[Display(Name = "City")]
public String City { get; set; }

[Display(Name = "State")]
public String State { get; set; }

[Display(Name = "Postal Code")]
public String PostalCode { get; set; }

[Display(Name = "Country")]
public String Country { get; set; }
}

public class Company
{
public Int32 Id { get; set; }

[Display(Name = "Company Name")]
public String Name { get; set; }

public Int32 AddressId { get; set; }

public virtual Address Address { get; set; }
}

地址_编辑局部 View

@model Models.Address

<div class="well">
<fieldset>
<legend>Address</legend>

@Html.EditorFor(model => model.Address1)
@Html.EditorFor(model => model.Address2)
@Html.EditorFor(model => model.City)
@Html.EditorFor(model => model.State)
@Html.EditorFor(model => model.PostalCode)
@Html.EditorFor(model => model.Country)
</fieldset>
</div>

公司编辑 View

@model Models.Company

@{
ViewBag.Title = "Edit";
Layout = "~/Views/shared/ContentLayout.cshtml";
}


<div class="row">
<div class="col-lg-12">
<div class="page-header">
<h2>Edit Company</h2>
</div>
</div>
</div>

<div class="row">
<div class="col-lg-8">
@using (Html.BeginForm("Edit", "Company", new { @class = "bs-example form-horizontal" })) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

@Html.HiddenFor(model => model.Id)

@Html.EditorFor(model => model.Name)

@Html.HiddenFor(model => model.AddressId)

@Html.Partial("~/Views/Address/_Edit.cshtml", Model.Address)

<p>
<button name="button" type="submit" class="btn btn-primary" value="submit">Submit</button>
</p>
}

</div>
</div>

公司编辑 Controller

[HttpPost]
public ActionResult Edit(Company model, int id)
{
if (ModelState.IsValid)
{
// model.Address = NULL here!

Success("Record updated!");
return RedirectToAction("Index");
}
}

最佳答案

要使模型绑定(bind)正常工作,您只需发布 Company回到你的 Controller 。只需将您的整个模型传递到您的部分:

@model Models.Company

@{
ViewBag.Title = "Edit";
Layout = "~/Views/shared/ContentLayout.cshtml";
}

<div class="row">
<div class="col-lg-12">
<div class="page-header">
<h2>Edit Company</h2>
</div>
</div>
</div>

<div class="row">
<div class="col-lg-8">
@using (Html.BeginForm("Edit", "Company", new { @class = "bs-example form-horizontal" })) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

@Html.HiddenFor(model => model.Id)

@Html.EditorFor(model => model.Name)

@Html.HiddenFor(model => model.AddressId)

@Html.Partial("~/Views/Address/_Edit.cshtml", Model)

<p>
<button name="button" type="submit" class="btn btn-primary" value="submit">Submit</button>
</p>
}
</div>
</div>

_编辑

@model Models.Company

<div class="well">
<fieldset>
<legend>Address</legend>
@Html.HiddenFor(model => model.Address.Id)
@Html.EditorFor(model => model.Address.Address1)
@Html.EditorFor(model => model.Address.Address2)
@Html.EditorFor(model => model.Address.City)
@Html.EditorFor(model => model.Address.State)
@Html.EditorFor(model => model.Address.PostalCode)
@Html.EditorFor(model => model.Address.Country)
</fieldset>
</div>

Controller

[HttpPost]
public ActionResult Edit(Company model, int id)
{
if (ModelState.IsValid)
{
// model.Address should now be available

Success("Record updated!");
return RedirectToAction("Index");
}
}

您现在应该看到 Address您的模型的导航属性在发布时正确绑定(bind)。


根据评论中的问题进行编辑

如何设置 View 和部分完全取决于您。要记住的重要一点是,模型绑定(bind)是基于 HTML 帮助器给表单元素的名称工作的。

所以 Html.HiddenFor(m => m.Id)将导致 <input name="Id">同时Html.HiddenFor(m => m.Address.Id)将导致 <input name="Address.Id"> .第一个不会被模型绑定(bind)器拾取为 Company 的导航属性, 第二个遗嘱。

简单的方法是只复制局部 View 。但是,如果它达到您的部分变得非常大且复杂且包含大量字段的程度,您可以创建一个部分基类,您的两个实体都继承自该基类。

BaseEntityWithAddress.cs

public partial class BaseEntityWithAddress
{
public virtual Address Address { get; set; }
}

客户.cs

public class Customer : BaseEntityWithAddress
{
// your properties, no need to redefine Address here
}

供应商.cs

public class Vendor: BaseEntityWithAddress
{
// your properties, no need to redefine Address here
}

然后您的部分 View 将占用 BaseEntityWithAddress作为一个模型,您仍会将整个模型传递给该模型。

_Edit.cshtml

@model Models.BaseEntityWithAddress

<div class="well">
<fieldset>
<legend>Address</legend>
@Html.HiddenFor(model => model.Address.Id)
@Html.EditorFor(model => model.Address.Address1)
@Html.EditorFor(model => model.Address.Address2)
@Html.EditorFor(model => model.Address.City)
@Html.EditorFor(model => model.Address.State)
@Html.EditorFor(model => model.Address.PostalCode)
@Html.EditorFor(model => model.Address.Country)
</fieldset>
</div>

这将生成具有正确名称的表单元素,供模型绑定(bind)器选取。

关于asp.net-mvc-4 - 我可以使用局部 View 在 ASP.NET MVC 中编辑多个模型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20278530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com