因爲我不太喜歡使用部分視圖,所以我已經成功地只能使用一個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(" «") + "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驗證來解決此問題?如果是這樣, 我如何確保控制器操作不會運行,除非數據有效,而不使用數據 註釋?
或者還有另一種更簡單的方法來處理這個驗證問題嗎?
任何想法,代碼示例和解釋將不勝感激。