2011-12-12 18 views
4

使用ASP.NET MVC3,剃刀和jQuery不顯眼的驗證(如Microsoft提供開箱即用)所需的字段。標記爲「對飛」

你怎麼可以標記「對飛」,只在某些情況下,即場要求?例如,如果用戶在「發佈者」角色中,則有「發佈日期」和「發佈」按鈕。按下「發佈」按鈕時需要「發佈日期」字段,但在「保存草稿」按鈕時則不需要。如果用戶不在該角色中,則「發佈」按鈕不會顯示在表單中,因此不是必需的。

我敢肯定,這是不是可以做開箱和額外的代碼需要兩個客戶端(jQuery驗證)和服務器端。如果可以的話,它如何完成並不明顯。

回答

0

這聽起來像在以下模型特異性和特異性更圖。即使您可以動態地將這種性質的要求綁定到模型上,也會違背MVC將模型邏輯從視圖邏輯中分離出來的目的。如果您擁有「發佈者」角色的模型,我建議您爲發佈控件創建模板(以及支持驗證)。

1

如果你在網絡表單土地這樣做,你會實例化按鈕的單擊事件處理程序一個RequiredFieldValidator並將其應用到應該成爲所需要的領域。

在MVC的土地,這是不是很明顯。 This SO question/answer demonstrates how to handle a button click - 您可以擴展它以實例化RequiredFieldValidator並將其應用於該字段。

在jQuery中您可以添加類似:

$("#buttonid").on("click", function() { $("#fieldToBeRequiredId").rules("add", { 
required: true }); } 
0

我將解釋在很短的例子的想法。我們有「IsMasterProject」來設置所需的「MasterProjectNo」字段的複選框:

要做到「對飛」,你需要下面的東西需要:

定義與現場模型,這是不嚴格[必填]

class ProjectList { 

    public bool IsMasterProject { get; set; } 

    // this field will be optionally required, 
    // we do not need the [Required] attribute 
    public string MasterProjectNo { get; set; } 

} 

創建的實例字段代碼視圖:

<div class="data-field"> 
    <div class="editor-label"> 
     <div id="IsMasterProjectLabel"> 
      Is Master Project 
     </div> 
    </div> 
    <div class="editor-field"> 
     <input id="IsMasterProject" class="check-box" type="checkbox" value="true" name="IsMasterProject" data-val-required="The IsMasterProject field is required." data-val="true" checked="checked"> 
    </div> 
</div> 

<div class="data-field"> 
    <div class="editor-label"> 
     <div id="MasterProjectNoLabel"> 
      Master Project No 
     </div> 
    </div> 
    <div class="editor-field"> 
     <input id="MasterProjectNo" type="text" value="" title="" style="width: 9.2em" placeholder="" name="MasterProjectNo" maxlength="15" data-val-length-max="15" data-val-length="The field MasterProjectNo must be a string with a maximum length of 15." data-val="true"> 
    </div> 
</div> 

添加Java腳本來處理點擊代碼,並添加或刪除「requir ED」標記:

$(function() { 

    $("#IsMasterProject").change(function() { OnIsMasterProjectValueChange(); }); 
    OnIsMasterProjectValueChange(); 
}); 

function OnIsMasterProjectValueChange() { 
    if ($('#IsMasterProject').is(':checked')) { 
     $('#IsMasterProjectLabel').append('<span class="label-required">*</span>'); 
    } 
    else { 
     $('#IsMasterProjectLabel span').remove() 
    } 
}; 

在控制器,你可以準備show動作:

[Authorize] 
public ActionResult Edit(int id) 
{ 
    try 
    { 
     ProjectList project = prepare_ProjectList(id); 

     return View(project); 
    } 
    catch (Exception ex) 
    { 
     sysHelper.LogError(ex, ModelState); ModelState.AddModelErrorException(ex, Request, "Probably selected data doesn't exist."); return View("Error"); 
    } 
} 

在攢動,你可以驗證的狀況下,你需要:

[HttpPost] 
public ActionResult Edit(ProjectList project) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      /* ------------------------------------------------------------------------ */ 
      /* HERE YOU CAN ADD YOUR CODE TO CHECK THE FIELD       */ 
      /* ------------------------------------------------------------------------ */ 

      if (project.IsMasterProject && string.IsNullOrEmpty(project.MasterProjectNo)) 
      { 
       ModelState.AddModelError("Model", "The MasterProjectNo field is required."); 
      } 

      /* ------------------------------------------------------------------------ */ 

      else 
      { 
       project.UserID = CurrentUser.ID; 
       project.C_updated = DateTime.Now; 

       db.ProjectList.Attach(project); 
       db.Entry<ProjectList>(project).State = System.Data.Entity.EntityState.Modified; 

       db.SaveChanges(); 

       return RedirectToAction("Index"); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     sysHelper.LogError(ex, ModelState); 

     ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator."); 
    } 

    prepareViewBag(project); 

    return View(project); 
} 

這很像一個魅力:) 祝你好運。