Реализация DefaultModelBinder не заполняет модель - ASP.NET MVC 2 - PullRequest
0 голосов
/ 29 августа 2011

У меня очень простая реализация DefaultModelBinder, мне нужно, чтобы он запускал какую-то пользовательскую проверку.

public class MyViewModelBinder : DefaultModelBinder 
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ModelStateDictionary modelState = bindingContext.ModelState;
        var model = (MyViewModel)base.BindModel(controllerContext, bindingContext);

        var result = ValidationFactory.ForObject<MyViewModel>().Validate(model);

        CustomValidation(result, modelState);

        return model;
    }
}

MyViewModel - это открытый закрытый класс.Связыватель модели регистрируется в Global.asax следующим образом:

ModelBinders.Binders.Add(typeof(MyViewModel), new MyViewModelBinder());

Проблема в том, что модель никогда не заполняется!Но механизм связывания модели MVC по умолчанию (я удаляю регистрацию в global.asax) работает нормально.

Это представление HTML:

    <table>
        <tr>
            <td><label for="Name">Name</label></td>
            <td><input id="Name" name="Name" type="text" value="" /></td>
        </tr>
        <tr>
            <td><label for="Code">Code</label></td>
            <td><input id="Code" name="Code" type="text" value="" /></td>
        </tr>
    </table> </div>

Каждое поле соответствует свойству модели.

1 Ответ

1 голос
/ 29 августа 2011

Из предоставленной вами информации я не могу воспроизвести проблему. Вот что я сделал.

Посмотреть модель:

public sealed class MyViewModel
{
    public string Name { get; set; }
    public string Code { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        // at this stage the model is populated perfectly fine
        return View();
    }
}

Индекс:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <% using (Html.BeginForm()) { %>
        <table>
            <tr>
                <td><label for="Name">Name</label></td>
                <td><input id="Name" name="Name" type="text" value="" /></td>
            </tr>
            <tr>
                <td><label for="Code">Code</label></td>
                <td><input id="Code" name="Code" type="text" value="" /></td>
            </tr>
        </table>
        <input type="submit" value="OK" />
    <% } %>
</body>
</html>

Модель переплета:

public class MyViewModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var model = (MyViewModel)base.BindModel(controllerContext, bindingContext);

        // at this stage the model is populated perfectly fine
        return model;
    }
}

Итак, теперь вопрос в том, чем ваш код отличается от моего, и что это за методы CustomValidation и Validate?

...