Как использовать ViewModels в ASP.NET MVC?

Я только начал изучать ViewModels в ASP.NET MVC. Итак, я подумал о реализации примера примера, как показано ниже:

Юридическое лицо

public class AddModel
{
    public int a { get; set; }
    public int b { get; set; }

    public int Add()
    {
        return (this.a + this.b);
    }
}

Добавить ViewModel

public class AddViewModel
{
    public AddModel addModel;
    public int Total { get; set; }
}

Контроллер

public class AddController : Controller
{
    [HttpPost]
    public JsonResult Add(AddViewModel model)
    {

        int iSum = model.addModel.a + model.addModel.b;
        model.Total = iSum;
        return Json(model);

    }

    public ActionResult Index()
    {
        return View();
    }
}

Просмотреть реализацию

@model ViewModelApplication.AddViewModel
<script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script>
<script src="../../Scripts/MicrosoftMvcAjax.debug.js" type="text/javascript"></script>
<script type="text/javascript">
    function Callback(data) {
        alert("I am sucess call");
    }

    function Failed() {
        alert("I am a failure call");
    }
</script>

@using (Ajax.BeginForm("Add", "Add", new AjaxOptions { OnSuccess = "Callback", OnFailure = "Failed" }))
{
    <table align="center">
        <tr>
            <td class="tdCol1Align">
                <label>
                    Number1</label>
            </td>
            <td class="tdCol2Align">
                @Html.TextBoxFor(Model => Model.addModel.a)
            </td>
        </tr>
        <tr>
            <td class="tdCol1Align">
                <label>
                    Number2</label>
            </td>
            <td class="tdCol2Align">
                @Html.TextBoxFor(Model => Model.addModel.b)
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type="submit" value="Add" class="button" />
            </td>
        </tr>
    </table>
}

Проблема здесь в том, что я не могу получить значения, введенные в текстовые поля, всякий раз, когда нажимается кнопка Add; это соответствующее действие AJAX.

Когда я пытаюсь получить доступ к значениям a и b, я получаю нули вместо значений, введенных в текстовые поля.

Я не уверен, где я ошибаюсь. Пожалуйста помоги.


person Sai Avinash    schedule 02.12.2013    source источник
comment
Видите ли вы ожидаемые значения в коллекции форм? Я не совсем уверен, но, поскольку вы выполняете обратную передачу AJAX, я полагаю, что ваша модель сериализуется, когда вы выполняете обратную передачу. Контроллер может больше не распознавать его как модель представления, но видит его как набор опубликованных значений. Но опять же, я не уверен, что это то, что происходит.   -  person Rob    schedule 02.12.2013
comment
@Rob.. да, я мог видеть значения в коллекции форм   -  person Sai Avinash    schedule 02.12.2013
comment
В общем, не рекомендуется включать модель как часть ViewModel.   -  person haim770    schedule 02.12.2013
comment
@ haim770..я с тобой согласен..но какая ему альтернатива..   -  person Sai Avinash    schedule 02.12.2013


Ответы (2)


ваша модель просмотра должна выглядеть так

public class AddViewModel
    {
        public int a { get; set; }
        public int b { get; set; }
        public int Total { get; set; }
    }

and in the cshtml

            <td class="tdCol2Align">
                @Html.TextBoxFor(m=> m.a)
            </td>

            <td class="tdCol2Align">
                @Html.TextBoxFor(m=> m.b)
            </td>

в контроллере

        [HttpPost]
        public JsonResult Add(AddViewModel model)
        {
            int iSum = model.a + model.b;
            model.Total = iSum;
            return Json(model);

        }

Изменить

Модель просмотра предназначена для визуализации ваших представлений, не помещайте в нее никакой логики. если у вас более сложная модель, будет сложно сопоставить Model с ViewModel. для этого вы можете использовать AutoMapper или ValueInjector для сопоставления между моделью и моделью представления.

ссылка на автомаппер http://automapper.codeplex.com/

ссылка на инжектор значений http://valueinjecter.codeplex.com/

надеюсь это поможет

person Anto Subash    schedule 02.12.2013
comment
@Анто.. что, если у тебя есть 20 полей... в модели предметной области... и я хочу их все вместе с 5 другими полями... - person Sai Avinash; 02.12.2013

Вы не должны использовать объекты домена (бизнеса) в своей модели представления. Если вы это сделаете, модель представления будет довольно бесполезной, поскольку она по-прежнему будет содержать бизнес-логику, которая вам может не понадобиться в представлении. Модель в вашем примере на самом деле не представляет реальный сценарий, модель представления для нее все равно не нужна.

Более распространенным и тривиальным примером модели представления является форма входа: возможно, у вас есть модель домена с именем User, и вы хотите, чтобы они вошли в систему. Модель домена User может быть большой, и для аутентификации требуется лишь небольшая ее часть. . Он также содержит логику проверки для базы данных, которая не представляет логику проверки для формы входа.

Модель предметной области User:

public class User
{
    [Required]
    public string UserName { get; set; }

    [Required]
    [MaxLength(36)] // The password is hashed so it won't be bigger than 36 chars.
    public string Password { get; set; }

    public string FullName { get; set; }

    public string SalesRepresentative { get; set; }

    // etc..
}

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

public class LoginModel
{
    [Display(Name = "User Name")]
    [Required(ErrorMessage = "Please fill in your user name.")]
    public string UserName { get; set; }

    [Required(ErrorMessage = "Please fill in your password.")]
    public string Password { get; set; }

    public bool RememberMe { get; set; }
}

Приведенная выше модель представления содержит только те свойства, которые нам нужны для формы входа, и имеет собственные аннотации данных. Это поможет вам четко разделить логику представления и логику бизнеса/данных.

person Henk Mollema    schedule 02.12.2013
comment
..Спасибо за объяснение . Но что, если моя модель домена содержит 20 полей, и мне нужно еще 2 дополнительных поля. Да, мне нужно поместить все эти поля в модель представления, которые уже есть в модели домена. - person Sai Avinash; 02.12.2013
comment
@Henk .. в моем примере модель просмотра может понадобиться в случае, когда мы не хотим создавать анонимный объект при отправке результатов обратно в просмотр (пример - всего в моем сценарии) - person Sai Avinash; 02.12.2013
comment
@Avinash да, иногда модели представлений являются копиями моделей предметных областей, но обычно они содержат другие атрибуты проверки и содержат аннотации данных для отображаемых имен и т. д. Мой личный опыт показывает, что у меня всегда возникают проблемы при использовании моделей предметных областей в моем представлении. - person Henk Mollema; 02.12.2013
comment
@Avinash с такой простой моделью предметной области, как в вашем примере, вы можете использовать ее непосредственно в своем представлении. Другими словами: это не хороший тест для практики с моделями представлений и понимания, зачем они вам нужны. - person Henk Mollema; 02.12.2013