【问题标题】:validation - user has already been added, MVC 4验证 - 已添加用户,MVC 4
【发布时间】:2014-12-04 09:57:33
【问题描述】:

我正在尝试向我的代码添加验证。

当我输入用户名并再次尝试时,我收到一条错误消息,提示违反 PRIMARY KEY 约束

由于我有 2 个主键(序列号和产品编号),所以我无法第二次添加用户,但是当我这样做时,我得到一个错误页面。

但实际上我想要一条消息说已经添加了用户或该行中的某些内容。

我尝试过目不转睛的回答,但一直在兜圈子,所以想问问你们。

这是我的代码

型号:

    public string SerialNumber { get; set; }
    public string ProductNumber { get; set; }

    [Required(ErrorMessage = "Before you submit you must enter a valid UserName!")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    [Display(Name = "Username")]
    public string UserName { get; set; }

    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    [Display(Name = "Alternative Username")]
    public string AltUserName { get; set; }

    public ReadingsUsersForm(string Ser_Num)
    {
        SerialNumber = Ser_Num;
        ProductNumber = cpctx.CustomerReadingsEntries.Where(s => s.ser_num == SerialNumber).Select(c => c.prod_um).FirstOrDefault();
        UserName = null;
        AltUserName = null;  
    }

控制器:

    [HttpPost]
    public ActionResult Save(EntrtyForm form)
    {

        var addForm = new M2CPDAL.Models.CustomerPortal.SerialUser();
        addForm.ser_num = form.SerialNumber;
        addForm.prod_num = form.ProductNumber;

        addForm.UserName = form.UserName;
        addForm.AltUserName = form.AltUserName;
        cp.SerialUsers.Add(addForm);
        cp.SaveChanges();

        return RedirectToAction("Index");
    }   

        public PartialViewResult GetAddEditReadings(string ser_num, string prod_num)
    {
        var model = new  AddEditReadingsViewModel(id, ser_num, prod_num, uProfile.CustNums);

        return PartialView("_ReadingsUsers", model);
    }

html代码:

@using (Html.BeginForm("Save", "Device", FormMethod.Post, new { enctype = "multipart/form-data" }))

{

<fieldset>
    <legend>Meter Reading Details</legend>

    <div>
        @Html.LabelFor(m => m.SerialNumber)
        @Html.TextBoxFor(m => m.SerialNumber, new { @class = "form", @readonly = "readonly" })
        @Html.ValidationMessageFor(m => m.SerialNumber)
    </div>
    <div>
        @Html.LabelFor(m => m.ProductNumber)
        @Html.TextBoxFor(m => m.ProductNumber, new { @class = "form", @readonly = "readonly" })
        @Html.ValidationMessageFor(m => m.ProductNumber)
    </div>

    <div>
        @Html.LabelFor(m => m.UserName)
        @Html.TextBoxFor(m => m.UserName, new { @id = "newColourReading", @class = "form-add" })
        @Html.ValidationMessageFor(m => m.UserName)
        <div id="ColourErrorMessage"></div>
   </div>

    <div>
        @Html.LabelFor(m => m.AltUserName)
        @Html.TextBoxFor(m => m.AltUserName, new { @id = "newColourReading", @class = "form-add2" })
        @Html.ValidationMessageFor(m => m.AltUserName)
        <div id="ColourErrorMessage"></div>

    </div>

    <div class="modal-footer">
        <input type="submit" id="ButtonSave" value="Submit" class="btn btn-primary">
        <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
    </div>

}

etc...

所以在 cp.SaveChanges();如果我第二次尝试添加用户,我会收到错误消息。

我可以遵循的任何想法或方向,我可以添加验证以检查是否已添加。

【问题讨论】:

  • 调用数据库检查值是否唯一,如果不是,使用ModelState.AddModelError()添加错误,然后返回视图显示。您还可以在提交之前使用[Remote] 属性在客户端上执行验证

标签: asp.net asp.net-mvc asp.net-mvc-4 validation


【解决方案1】:

您无法使用标准验证属性来解决它。你应该从你的数据库中得到答案。如果有一种方法可以在您的解决方案中实施它。

[HttpPost]
public ActionResult Save(EntrtyForm form)
{

    var addForm = new M2CPDAL.Models.CustomerPortal.SerialUser();
    var serialUser = cp.SerialUsers.FirstOrDefault(x => x.serialNumber == form.serialNumber && x.productNumber == form.productNumber);
    if(serialUser == null)
    {
      addForm.ser_num = form.SerialNumber;
      addForm.prod_num = form.ProductNumber;
      addForm.UserName = form.UserName;
      addForm.AltUserName = form.AltUserName;
      cp.SerialUsers.Add(addForm);
      cp.SaveChanges();
      return RedirectToAction("Index");
    }
    return RedirectToAction("serialUserExist");
}   

但如果您使用 ModelState.IsValid 强类型化视图,则更好的解决方案

[HttpPost]
public ActionResult Save(EntrtyForm form)
{

    var addForm = new M2CPDAL.Models.CustomerPortal.SerialUser();
    var serialUser = cp.SerialUsers.FirstOrDefault(x => x.serialNumber == form.serialNumber && x.productNumber == form.productNumber);
    if(serialUser == null)
    {
      addForm.ser_num = form.SerialNumber;
      addForm.prod_num = form.ProductNumber;
      addForm.UserName = form.UserName;
      addForm.AltUserName = form.AltUserName;
      cp.SerialUsers.Add(addForm);
      cp.SaveChanges();
      return RedirectToAction("Index");
    }
    ModelState.AddModelError("SerialNumber", "Already Exist");
    var model = new AddEditReadingsViewModel(form);
    return PartialView("_ReadingsUsers", form);
}   

不要忘记创建从你的EntrtyForm 初始化AddEditReadingsViewModel 的构造函数

【讨论】:

  • 谢谢我明白这一点,但在 ModelState.IsValid = property 或索引器 'System.Web.Mvc.ModelStateDictionary.IsValid' 无法分配给 - 它是只读的
  • 糟糕,我的错。 Here 是解释。
  • 好的,谢谢,但是你没有返回 View("AddSerialUserView");这是假设返回一个新页面还是什么,因为我想要的只是一条错误消息......
  • 如果您只需要错误消息 - 是的,您可以返回另一个视图并使用错误传递字符串。
  • 如果你使用ModelState.AddModelError("SerialNumber", "Already Exist")然后你需要返回与return View(form);相同的视图
【解决方案2】:

在您的 Save 方法中,只需输入一些代码即可查找并输入此序列号和产品号。如果存在,将用户发送到另一个页面

var exist = cp.SerialUsers.Where(x => x.serialNumber == form.serialNumber && x.productNumber == form.productNumber).FirstOrDefault()
if(exist!=null)
    return RedirectToAction("Exists"); 

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2021-12-29
    • 2013-11-23
    相关资源
    最近更新 更多