2014-03-31 17 views
1

因爲我不太喜歡使用部分視圖,所以我已經成功地只能使用一個ViewModel以我想要的方式顯示錶單,並且提交數據的工作正常。不使用數據註解的ASP.NET MVC Valdiation?

問題是驗證然而,因爲我有兩個虛擬屬性在數據庫中,我不認爲我實際上能夠使用他們的數據註釋。

這是我使用的productviewmodel。

public class ProductViewModel 
{ 
    public Guid Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    public string Description1 { get; set; } 

    [Required] 
    public string Description2 { get; set; } 

    [Required] 
    public string Description3 { get; set; } 

    public string Status { get; set; } 

    [Required] 
    public string Image { get; set; } 

    [Required] 
    public double? Weight { get; set; } 

    [Required] 
    public string SelectedCategory { get; set; } 
    public IEnumerable<SelectListItem> Categories { get; set; } 

    public string SelectedProductStatus { get; set; } 
    public IEnumerable<SelectListItem> ProductStatuses { get; set; } 


    [DataType(DataType.Currency)] 
    public decimal Price { get; set; } 

    [Required] 
    [Display(Name = "Relase Date")] 
    [DataType(DataType.Date)] 
    public DateTime? ReleaseDate { get; set; } 

    //Note that I'm using these virtual properties so that I don't have to use 
    //different viewmodels in partial views. 
    public virtual Stock Stock { get; set; } 
    public virtual ICollection<Rating> Rating { get; set; } 
    public virtual Discount Discount { get; set; } 
    public virtual Category Category { get; set; } 
    } 
    } 

這裏是股票的看法:

@model GUI.Models.ProductViewModel 

@{ 
    ViewBag.Title = "Stock"; 
} 

<h2>Stock</h2> 


@using (Html.BeginForm("UpdateStock","Product", FormMethod.Post)) 
{ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h4>Stock for @Model.Name</h4> 
    <hr /> 
    @Html.ValidationSummary(true) 
    @Html.HiddenFor(model => model.Id) 

    <div class="form-group"> 
     @Html.Label("Quantity in Stock", new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      //Note that is is how I use the productviewModel to display and 
      @Html.EditorFor(model => model.Stock.Quantity) 
      @Html.ValidationMessageFor(model => model.Stock.Quantity) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.Label("Delivery Date for Stock (yyyy/mm/dd)", new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Stock.DeliveryDate) 
      @Html.ValidationMessageFor(model => model.Stock.DeliveryDate) 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Save" class="btn btn-default" onclick="validate()"/> 
     </div> 
    </div> 
    </div> 
} 

    <div> 
    @Html.ActionLink((HttpUtility.HtmlDecode(" &laquo;") + "Back to Products"), "Index", "Product", null, new { @class = "btn btn-primary btn-large" }) 

這是提交表單時我打電話控制器動作。

[HttpPost] 
    public ActionResult UpdateStock(Guid id, ProductViewModel model) 
    { 
     int quantity = (int)model.Stock.Quantity; 
     DateTime deliveryDate = Convert.ToDateTime(model.Stock.DeliveryDate); 

     _manager.UpdateProductStock(id, quantity, deliveryDate);   
     return RedirectToAction("Index"); 
    } 

因爲我不知道我是否能夠使用數據標註與否,我必須確保數量字段僅僅是一個整數,該deliverydate是日期格式。

我是否必須編寫大量javascript驗證來解決此問題?如果是這樣, 我如何確保控制器操作不會運行,除非數據有效,而不使用數據 註釋?

或者還有另一種更簡單的方法來處理這個驗證問題嗎?

任何想法,代碼示例和解釋將不勝感激。

回答

0

如果不使用數據註釋,還可以在服務器端驗證您的模型,並將警報添加到ModelState並在視圖中顯示它們。

第二種方法是使用客戶端驗證。其中之一是Jquery Validation Engine。有很多樣品here

0

您可以一起使用虛擬屬性和DataAnnotations。 Here is an example using lazy loading with EF

UPDATE:

後的要點是:

public virtual Stock Stock { get; set; } 
public virtual ICollection<Rating> Rating { get; set; } 
public virtual Discount Discount { get; set; } 
public virtual Category Category { get; set; } 

現在,在你的對象:

public class Stock 
{ 
    [Display(Name = "My property name"] 
    public virtual string SomeProperty {get;set;) 

    //all the properties 
} 
0

感謝您的反饋。這個地方太棒了。

嵌套Viewmodels似乎爲我做了詭計。從我的哥們那裏得到了很棒的提示。 我在ProductViewModel加入這一領域:

public StockViewModel StockViewModel { get; set; } 

而且我加了StockViewModel:

public class StockViewModel 
{ 
    public Guid Id { get; set; } 

    [Required] 
    [RegularExpression("^[0-9]*$", ErrorMessage = "Only integer numbers are allowed")] 
    public int? Quantity { get; set; } 

    [Required] 
    [DataType(DataType.Date)] 
    public DateTime? DeliveryDate { get; set; } 
} 

而且我做了以下變化的股票控制器:

[HttpGet] 
    public ActionResult Stock(Guid id) 
    { 
     Product product = _productRepository.GetById(id); 

     var productViewModel = new ProductViewModel 
     { 
      Id = product.Id, 
      Name = product.Name, 

      StockViewModel = new StockViewModel { Id = product.Stock.Id, DeliveryDate = product.Stock.DeliveryDate, Quantity = product.Stock.Quantity } 
     }; 


     return View(productViewModel); 
    } 

    [HttpPost] 
    public ActionResult UpdateStock(Guid id, ProductViewModel model) 
    { 

     int quantity = (int)model.StockViewModel.Quantity; 
     DateTime deliveryDate = Convert.ToDateTime(model.StockViewModel.DeliveryDate); 

     _manager.UpdateProductStock(id, quantity, deliveryDate);   
     return RedirectToAction("Index"); 
    } 

然後我做了這些股票觀點的變化:

<div class="form-group"> 
     @Html.Label("Quantity in Stock", new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      //Note the changes here 
      @Html.EditorFor(model => model.StockViewModel.Quantity) 
      @Html.ValidationMessageFor(model => model.StockViewModel.Quantity) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.Label("Delivery Date for Stock (yyyy/mm/dd)", new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      //Note the changes here! 
      @Html.EditorFor(model => model.StockViewModel.DeliveryDate) 
      @Html.ValidationMessageFor(model => model.StockViewModel.DeliveryDate) 
     </div> 
    </div> 
相關問題