编辑:我已更改问题和代码以更好地澄清我的问题
我有这个(强类型视图)确实使用控制器中为该特定模型提供的值
我想从另一个模型中向模型中添加一些东西,从我的httpPost回复后回复没有任何反应......
提前致谢!
--------------------------------------其他代码,以澄清我的问题----
public class Address
{
public int Id { get; set;}
public String Name { get; set;}
}
public class OtherAddress
{
public int Id { get; set;}
public String Name { get; set;}
public String City { get; set;}
}
public class MasterModel
{
public Address Address { get; set;}
public List<OtherAddress> OtherAddressess { get; set;}
}
public ActionResult Create()
{
MasterModel Model = new MasterModel();
Model.Person = new Person();
Model.Address = new Address();
Model.OtherAdressess = new List<OtherAddress>();
DBContext _db = new DBContext();
Model.OtherAdressess = _db.OtherAddressess.Where(a=> a.City == "Amsterdam");
return View(Model);
}
视图中的
@model Project.Models.MasterModel
List<SelectListItems> items = new List<SelectListItems>();
foreach(var a in Model.OtherAddressess)
{
SelectListItem item = new SelectListItem();
item.Value = a.Id.toString();
item.Text = a.Street;
}
@using (@Html.BeginForm())
{
<div>
<select name="otheraddress">
foreach(var i in Items)
{
<option value=@i.Value>@i.Text</option>
}
</select>
<input type="submit" name="select" value="Select Address"/>
</div>
<div>
@Html.EditorFor(model => Model.Address.Name)
<div>
<p>
<input type="submit" value="Submit"/>
</p>
}
在帖子中
[HttpPost]
public ActionResult Create(MasterModel Model)
{
String otherAddressSelected = Request.Params["select"];
if(!String.IsNullOrEmpty(otherAddressSelected))
{
int id = int.Parse(Request.Params["otheraddress"]);
DBContext _db = new DBContext();
OtherAddress oa = _db.OtherAddress.Single(oa=> oa.Id == id);
Model.Address.Name = oa.Name;
return View(Model);
}
//other stuff here
}
答案 0 :(得分:6)
如果要在[HttpPost]控制器中更改模型的值,则必须删除要更改的实例/属性的modelstate。例如:
[HttpPost]
public ActionResult Index(SomeModel model)
{
ModelState.Remove("Name");
model.Name = "some new name";
return View(model);
}
从this示例
获得答案答案 1 :(得分:0)
asp.net mvc中的输入助手将使用post值,如果他们在查看模型之前可以找到任何值。
在这种情况下,我认为问题在于您正在尝试在Create POST操作中执行更多操作。一个动作(与应用程序中的任何方法一样)应该只做一件事。在你的情况下,我会做这样的事情(如果我理解正确的工作流程):
//Action: SelectAddress
public ActionResult SelectAddress() {
var addresses = _db.OtherAddressess.Where(a=> a.City == "Amsterdam");
return View(new SelectAddressViewModel(addresses));
}
//View SelectAddress
....
<ul>
@foreach(var address in Model.Addresses) {
<li>
<a href="@Url.Action("Create", "Product", new { addressId = address.Id })">
@Model.Name
</a>
</li>
}
</ul>
....
//Action Create
public ActionResult Create(int addressId) {
var address = _db.OtherAddress.Single(oa=> oa.Id == addressId);
var Model = new MasterModel();
Model.Person = new Person();
Model.Address = new Address {
Name = address.Name
}
return View(Model);
}
答案 2 :(得分:0)
我会创建一个名为details的动作方法,接受person id作为参数:
public ActionResult Details(int id)
{
// Get person and display
}
您的Create操作方法用于创建Person类型对象,而不显示其详细信息。从逻辑上讲,你所做的事情对我来说似乎并不合适。
应该有用于显示创建人员的视图的操作方法和用于将其持久保存到数据库中的等效HTTP操作方法。
然后我将重定向到一个用于显示Person类型对象信息的action方法。
return RedirectToAction("Details", new { id = Person.Id });