这似乎是模型绑定(bind)导致了我的问题。
基本上我有一个名为 ProductOption 的模型,为了这个问题的目的,它有 2 个字段
ID (Int) PK ProductID (Int) FK
我有一个标准的路线设置
context.MapRoute(
"Product_default",
"Product/{controller}/{action}/{id}",
new { controller = "Product", action = "Index", id = UrlParameter.Optional }
);
如果用户想要添加一个选项,URL 是
/Product/Options/Add/1
在上面的 URL 中,1 是 ProductID,我有以下代码来返回 View 的空白模型,
[HttpGet]
public ActionResult Add(int id)
{
return View("Manage", new ProductOptionModel() { ProductID = id });
}
现在在我看来我保留了一个隐藏字段
<%= Html.HiddenFor(x=>x.ID) %>
这用于确定(在提交时)我们是否正在编辑或添加新选项。然而,.net 中的模型联编程序似乎将 .ID(离开上面的 get actionresult 时为 0)替换为 1(或 URL 中 id 参数的值)
我怎样才能停止或解决这个问题?
View 模型
public class ProductExtraModel
{
//Database
public int ID { get; set; }
public string Name { get; set; }
public int ProductID { get; set; }
public ProductModel Product { get; set; }
}
最佳答案
我认为正在设置 id
参数,因为默认情况下,您的路由会设置它。在您的 Controller 中,您在 ProductID 的 ViewModel 中设置了一个附加参数,这可能始终等于 ID 参数,因为两者基本上都设置为 QueryString/GET 参数。 (在本例中为 1)。
当您阻止它分配 ID 参数时,您更改路由的修复似乎是一个不错的选择,但可能并不理想 - 取决于您希望如何解决问题:
context.MapRoute(
"Product_addoptionalextra",
"Product/{controller}/Add/{ProductID}",
new { controller = "Product",action="Add", ProductID = UrlParameter.Optional }
);
或者,重新安排您的变量,使 ID 实际上是相关的 ProductID,然后您可以使用代表 ID 的 OtherID。
如果您有 MVC 2,我可能会建议解决此问题的方法是使用 EditorTemplates / DisplayTemplates .虽然我不知道您的 ProductViewModel
,但我认为它包含 ID。如果您设置了适当的模板,您几乎可以忘记可能重叠的 ID。
public class ProductExtraModel
{
//Database
public int ID { get; set; }
public string Name { get; set; }
[UIHint("Product")]
public ProductModel Product { get; set; }
}
当使用 productExtraViewModel.Product.ID
将模型传递回 Controller 时,您将能够访问产品 ID,并且您的正常 ID 仍将在 productViewModel.Id 上可用
。
关于c# - Asp.Net MVC - 参数与模型值的绑定(bind)!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3038295/