2014-12-04 23 views
0

我正在嘗試爲我的代碼添加驗證。驗證 - 用戶已被添加,MVC 4

當我輸入用戶名,並再次嘗試它,我得到一個錯誤說PRIMARY KEY約束

的違反事件,我有2個主鍵(SERIALNUMBER和productNumber)所以我不會能夠添加用戶第二次,但是當我這樣做,我得到一個錯誤頁面。

但我真的想要一條消息說用戶已經添加或在該行中的東西。

我嘗試了一些可以回答的問題,但是在圈子裏四處走動,所以我想問你們。

這是我的代碼

型號:

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();如果我第二次嘗試添加用戶,我會得到一個錯誤。

任何想法或方向我可以跟隨我在哪裏可以添加驗證,以檢查是否已添加或不。

+2

調用數據庫檢查值是唯一的初始化AddEditReadingsViewModel ,如果沒有,使用'ModelState.AddModelError()'添加一個錯誤,然後返回視圖來顯示它。在提交 – 2014-12-04 10:01:55

回答

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

+0

之前,您還可以使用'[Remote]'屬性在客戶端上執行驗證,謝謝我得到這個,但是在ModelState.IsValid =屬性或索引器'System.Web.Mvc.ModelStateDictionary.IsValid '不能被分配到 - 它是隻讀的 – 2014-12-04 11:24:15

+0

Ooops,我的壞。 [Here](http://stackoverflow.com/a/3169667/1849444)是解釋。 – 2014-12-04 11:28:10

+0

好酷謝謝,但你沒有你有返回查看(「AddSerialUserView」);這是假設返回一個新的頁面或東西,因爲我想要的是一個錯誤信息... – 2014-12-04 11:33:06

1

在您的保存方法中,只需放入一些代碼,查找並輸入此序列號和產品編號即可。如果有,請將用戶發送到另一頁

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