Одним из возможных способов обработки данных POST и добавления проверки является использование связывателя пользовательской модели.
Вот небольшой пример того, что я недавно использовал для добавления пользовательской проверки данных POST-формы:
public class Customer
{
public string Name { get; set; }
public DateTime Date { get; set; }
}
public class PageController : Controller
{
[HttpPost]
public ActionResult ActionA(Customer customer)
{
if(ModelState.IsValid) {
//do something with the customer
}
}
[HttpPost]
public ActionResult ActionB(Customer customer)
{
if(ModelState.IsValid) {
//do something with the customer
}
}
}
CustomerModelBinder будет выглядеть примерно так:
public class CustomerModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.Name == "Name") //or date or whatever else you want
{
//Access your Name property with valueprovider and do some magic before you bind it to the model.
//To add validation errors do (simple stuff)
if(string.IsNullOrEmpty(bindingContext.ValueProvider.GetValue("Name").AttemptedValue))
bindingContext.ModelState.AddModelError("Name", "Please enter a valid name");
//Any complex validation
}
else
{
//call the usual binder otherwise. I noticed that in this way you can use DataAnnotations as well.
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
и в global.asax поставить
ModelBinders.Binders.Add(typeof(Customer), new CustomerModelBinder());
Если вы не хотите связывать свойство Name (просто Date) при вызове ActionB, просто сделайте еще один пользовательский связыватель модели и в операторе if поместите для возврата значение null или уже существующее значение ты хочешь. Затем в контроллере положите:
[HttpPost]
public ActionResult([ModelBinder(typeof(CustomerAModelBinder))] Customer customer)
[HttpPost]
public ActionResult([ModelBinder(typeof(CustomerBModelBinder))] Customer customer)
Где customerAmodelbinder будет связывать только имя, а customerBmodelbinder будет связывать только дату.
Это самый простой способ, который я нашел, для проверки привязки модели, и я достиг некоторых очень крутых результатов с моделями сложного вида. Могу поспорить, что есть что-то, что я пропустил, и, возможно, более опытный может ответить.
Надеюсь, я правильно понял ваш вопрос ...:)