Соглашение об именовании привязки модели MVC для дочерних объектов? - PullRequest
4 голосов
/ 07 июня 2011

У меня проблемы с соглашением об именовании моделей по умолчанию, когда есть дочернее свойство. Например:

У меня есть ViewModel, которая выглядит примерно так:

public class UserViewModel
{
    public User BusinessObject { get; set; }
}

В классе «Мой пользователь» есть свойство «NetworkLogin»

My View имеет что-то вроде этого: <%: Html.LabelFor (model => model.BusinessObject.NetworkLogin)%> <%: Html.TextBoxFor (model => model.BusinessObject.NetworkLogin)%> Автозаполнения

И мой контроллер, что я хотел бы сделать, это

    [HttpGet]
    public ActionResult UserIndex(string networkLogin) { }

Проблема: Входной параметр "networkLogin" всегда равен нулю. Это имеет смысл, потому что фактическим параметром в элементе html является name = "BusinessObject.NetworkLogin" и id = "BusinessObject_NetworkLogin". Однако я не знаю, какое имя параметра мне следует использовать в моем методе действия. Я пробовал "businessObject_NetworkLogin", и он тоже не работает.

Однако у меня есть этот обходной путь, который работает, но мне он не нравится. Я добавляю это к моей ViewModel:

    public string NetworkLogin
    {
        get
        {
            if (BusinessObject == null)
                BusinessObject = new User(); 
            return BusinessObject.NetworkLogin;
        } 
        set
        {
            if (BusinessObject == null)
                BusinessObject = new User();
            BusinessObject.NetworkLogin = value;
        }
    }

И моя страница просмотра теперь говорит об этом. <%: Html.TextBoxFor (model => model.NetworkLogin)%>

Может кто-нибудь сказать мне, каково правильное соглашение об именах для привязки модели по умолчанию, чтобы мне не приходилось использовать вышеуказанный обходной путь?

Спасибо!

1 Ответ

11 голосов
/ 08 июня 2011

Укажите префикс, чтобы связыватель модели знал, что параметр строки запроса BusinessObject.NetworkLogin фактически ссылается на networkLogin, который вы используете в качестве аргумента действия

public ActionResult UserIndex(
    [Bind(Prefix = "BusinessObject")] string networkLogin
) 
{ 
    ...
}

или повторно используйте модель вида:

public ActionResult UserIndex(UserViewModel model) 
{ 
    // TODO: use model.BusinessObject.NetworkLogin
    // which is gonna be correctly bound here
    ...
}

Что касается вашего обходного пути, после того как вы приведете в действие одно из двух моих предложений, ваше свойство модели представления должно действительно выглядеть так:

public string NetworkLogin { get; set; }
...