ASP.NET MVC路由参数替换模型字段

时间:2017-12-21 12:48:07

标签: asp.net-mvc routes modelstate

我正在使用Visual Studio 2017社区版测试ASP.NET MVC 5应用程序。

我正在尝试使用以下代码将Assort模型保存到数据库。 我正在使用网址Assort Create导航到/Assort/Create/1A页面。 1A的{​​{1}}页面上需要参数create,因为我需要在创建页面本身上显示该参数的一些其他信息。

但是当我提交数据时,Assort参数值被插入为1A模型的ID值,因此我的Assort无效,我无法保存数据。

任何人都可以帮助我吗?

MODEL

ModelState

ACTION

public class Assort
{
    [Key]
    public int ID { get; set; }

    [Display(Name = "Assort No")]
    [Required(ErrorMessage = "Assort No can not be empty.")]
    public int ASSORTNO { get; set; }

    [Display(Name = "Date")]
    [Required(ErrorMessage = "Date can not be empty.")]
    public DateTime DATE { get; set; }

    [Display(Name = "RFNO")]
    [Required(ErrorMessage = "RFNO can not be empty.")]
    [StringLength(50)]
    public string RFNO { get; set; }

    [Display(Name = "Manager")]
    [Required(ErrorMessage = "Manager can not be empty.")]
    public int MANAGER { get; set; }

    [Display(Name = "Caret")]
    [Required(ErrorMessage = "Caret can not be empty.")]
    public decimal CARET { get; set; }

    [Display(Name = "MFG Size")]
    [Required(ErrorMessage = "MFG Size can not be empty.")]
    public decimal MFGSIZE { get; set; }

    [Display(Name = "Total PCS")]
    [Required(ErrorMessage = "Total PCS can not be empty.")]
    public decimal TOTALPCS { get; set; }

    [StringLength(50)]
    public string APPROVALSTATUS { get; set; }

    [Display(Name = "Details")]
    public string DETAILS { get; set; }

    [ScaffoldColumn(false)]
    public DateTime CREATE_TIMESTAMP { get; set; }
    [ScaffoldColumn(false)]
    public DateTime LAST_EDIT_TIMESTAMP { get; set; }

    [UIHint("AssortReturn")]
    public virtual List<AssortReturn> AssortReturn { get; set; }

    public Assort()
    {
        AssortReturn = new List<AssortReturnModel.AssortReturn>();
    }

    [ForeignKey("RFNO")]
    public virtual Rough rough { get; set; }
}

查看

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Assort assort)
    {
        if (ModelState.IsValid)
        {
            assort.APPROVALSTATUS = "NOT APPROVED";
            assort.CREATE_TIMESTAMP = DateTime.Now;
            assort.LAST_EDIT_TIMESTAMP = DateTime.Now;
            db.Assorts.Add(assort);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        Initialize(assort.RFNO,"CREATE");
        return View(assort);
    }

}

3 个答案:

答案 0 :(得分:1)

这是因为默认路由正在处理您的请求。它看起来像:

{controller}/{action}/{id}

因此A1绑定了ID。如果你想要一个不同的行为,比如A1仍然是URL的一部分,但是绑定到另一个参数,比如&#34; name&#34;,你需要一个新的路径:

    routes.MapRoute(
        name: "CreateAssort",
        url: "Assort/Create/{name}",
        defaults: new { controller = "Assort", action = "Create"}
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

现在&#34;名称&#34;将持有A1而不是ID。请注意您的自定义路由如何在默认路由之前。这很重要 - 路由选择匹配请求的第一条路线。

答案 1 :(得分:1)

您可以执行的操作是在视图中添加名为hidden的{​​{1}}输入字段。

当提交表单时,此字段中的值将优先于您的路径中的值,即'1A',如果您未设置隐藏输入的值,则模型将ID设为0。

答案 2 :(得分:0)

我有同样的问题。但是问题出在创建模型时。

您需要两种方法。

UIImageView

C# ASP MVC Route Model ID bug