代码之家  ›  专栏  ›  技术社区  ›  LiamB

ASP.NET MVC-将参数绑定到模型值!

  •  2
  • LiamB  · 技术社区  · 14 年前

    这似乎是模型绑定导致了我的问题。

    实际上,我有一个名为ProductOption的模型,对于这个问题,它有两个字段

    ID(int)PK 产品ID(int)FK

    我有一个标准的路线设置

        context.MapRoute(
            "Product_default",
            "Product/{controller}/{action}/{id}",
            new { controller = "Product", action = "Index", id = UrlParameter.Optional }
        );
    

    如果用户想添加一个选项,URL是,

    /产品/选项/添加/1

    在上面的url 1是productID,我有下面的代码返回一个空模型的视图,

    [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参数的值)。

    我怎么能停下来解决这个问题呢?

    视图模型

    public class ProductExtraModel
    {
        //Database 
        public int ID { get; set; }
        public string Name { get; set; }
        public int ProductID { get; set; }
    
        public ProductModel Product { get; set; }
    }
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Amadiere    14 年前

    我认为 id 正在设置参数,因为默认情况下,路由会设置该参数。在控制器内部,您在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 你的普通身份证在 productViewModel.Id .

        2
  •  0
  •   LiamB    14 年前

    我已经通过更新我的路线来解决这个问题(不完全满意-但它有效)

     public override void RegisterArea(AreaRegistrationContext context)
            {
                context.MapRoute(
                   "Product_addoptionalextra",
                   "Product/{controller}/Add/{ProductID}",
                   new { controller = "Product",action="Add", ProductID = UrlParameter.Optional }
                );
    
                context.MapRoute(
                    "Product_default",
                    "Product/{controller}/{action}/{id}",
                    new { controller = "Product", action = "Index", id = UrlParameter.Optional }
                );         
            }