2012-07-05 80 views
0

我是MVC的新手,不確定正確的設計。類庫,MVC和數據註釋

我有我在各種應用程序中使用的類對象。我已經採取了編寫自定義視圖模型類的方法,以便我可以訪問所有這些對象中的屬性並擁有強大的類型。如果不在視圖模型中重新輸入所有類代碼,是否有任何方法可以使用數據註釋驗證這些對象中的屬性?請讓我知道,如果我的方法和設計都是錯誤的。

[Required]   
public User user = new User("username"); 
//User has lots properites and methods, could i validate inside my class code? 

//我想避免是把下面的東西在我的自定義視圖模型類,//因爲我已經有一個類庫這個東西:

public class User 
{ 

    [Required] 
    [StringLength(160)] 
    public string prop1 { get; set; } 
    [Required] 
    [StringLength(160)] 
    public string prop2 { get; set; } 
    [Required] 
    [StringLength(160)] 
    public string prop3 { get; set; } 

    public User(string token) 
    { 
     SetUser(token); 
    } 


    public void SetUser(string token) 
    { 
     this.prop1 = "this"; 
     this.prop2 = "this2"; 
     this.prop3 = "this3"; 

    } 

== ========== 很高興知道我可以,但我在某些問題上磕磕絆絆。在我看來,我有:@ Html.EditorFor(modelItem => modelItem.user.prop1)

我把數據註釋的東西放在我的類域中。當它呈現時它確實顯示註釋。

<input class="text-box single-line" data-val="true" data-val-length="The field prop1 must be a string with a maximum length of 5." data-val-length-max="5" data-val-required="The prop1 field is required." id="user_prop1" name="user.prop1" type="text" value="somevalue" /> 

但是當我去我的控制器參數爲null。我想因爲這個名字是user.prop1。我嘗試了一個文本框,我指定了name屬性,但是我的控制器仍然無法爲我的參數獲取值。

====================

  @model TrainingCalendar.Models.Training 

      @{ 
       ViewBag.Title = "Signup"; 
      } 

      <h2>Signup</h2> 

      <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
      <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

      @using (Html.BeginForm("ConfirmSignup", "Training", FormMethod.Post)) 
      { 
       @Html.ValidationSummary(true) 
       <fieldset> 
        <legend>Training</legend> 
        <p> 
        @Html.Label("date", Model.SpecifiedCourse.strClassDate) 
        </p> 
        <p> 
        @Html.Label("time", Model.SpecifiedCourse.Time) 
        </p> 
        <p> 
        @Html.Label("instructor", Model.SpecifiedCourse.Instructor) 
        </p> 
        <p> 
        @Html.Hidden("id", Model.SpecifiedCourse.ID) 
        </p> 
        <table> 
         <tr> 
          <td>@Html.LabelFor(modelItem => modelItem.ApplicationUser.prop1)</td> 
          <td>@Html.EditorFor(modelItem => modelItem.ApplicationUser.prop1)</td> 
          <td style="color:Red">@Html.ValidationMessageFor(modelItem => modelItem.ApplicationUser.prop1)</td> 
         </tr> 
         <tr> 
          <td>@Html.LabelFor(modelItem => modelItem.ApplicationUser.prop2)</td> 
          <td>@Html.EditorFor(modelItem => modelItem.ApplicationUser.prop2)</td> 
          <td style="color:Red">@Html.ValidationMessageFor(modelItem => modelItem.ApplicationUser.prop2)</td> 
         </tr> 

        </table> 
        <p> 
         <input type="submit" value="Sign Up" /> 
        </p> 
       </fieldset> 
      } 

      <div> 
       @Html.ActionLink("Back to List", "Index") 
      </div> 

===================

  public ActionResult ConfirmSignup(
         int id, 
         string prop1, 
         string prop2) 
        { 
         SignUpForClass(); 
        return View(); 
       } 
+0

什麼參數爲空?你在使用模型綁定嗎? – GunnerL3510 2012-07-09 19:02:26

+0

我正在嘗試創建一個自定義模型聯編程序。我一直沒有能夠得到它的工作。我的自定義視圖模型類具有我自己創建的通用列表,2個字符串,1個int和2個對象:用戶和培訓課程。用戶對象有一個設置值的方法,但是我已經將它移出構造函數。任何幫助表示讚賞。 – 2012-07-16 21:19:50

+0

你可以發佈你的POST(無雙關意圖)操作方法嗎? – GunnerL3510 2012-07-17 19:42:01

回答

0

絕對可以在您的班級代碼上擁有數據註釋屬性。如果您要在視圖模型中封裝類,請在視圖中填充封裝類的屬性。在驗證過程中,類成員將根據您在類聲明中指定的數據註釋屬性進行驗證。

+0

感謝您的回覆。我一直在努力按照你的建議去做,而且我遇到了一些問題。我把上面的附加信息放在原文中。 – 2012-07-06 18:42:57

0

我也偶然發現了這個,我最終做了什麼(我不知道它是最好還是最正確的)也是數據註釋,它主要影響我的類庫的DOM中的數據庫,例如MaxLength,Required等,然後在我的視圖模型中,我有主要與驗證有關的數據註釋,如正則表達式,日期時間格式,最大值或最大長度。通過這種方式,我將系統的兩個不同方面的角色分開。視圖模型是從我的DOM到我的視圖可以使用的格式的翻譯,我的DOM專門用於定義數據庫中數據的外觀。

+0

很高興知道我可以,但我在某些問題上磕磕絆絆。在我看來,我有: – 2012-07-06 18:34:05