ASP.Net-MVC-3 Проблемы с новичками в ViewModels и их отправка на контроллер - PullRequest
1 голос
/ 28 ноября 2011

Я строю свои сущности через базу данных в первую очередь, так как я должен использовать существующую базу данных.

Теперь, допустим, у меня есть клиент и страна и я хочу отредактировать клиента. Мое представление должно содержать что-то вроде имени, фамилии и страны, которые представляют собой выпадающий список из всех стран в организации. Для этого я создал CustomerViewModel, который использует эти две сущности. Но я не знаю, все ли это правильно, потому что некоторые вещи не работают.

Сначала код моего CustomerViewModel:

public class CustomerViewModel
{
    public CUSTOMER customer { get; set; }
    public COUNTRY country { get; set; }
    public IEnumerable<SelectListItem> countryList { get; set; }

    MyEFEntities db = new MyEFEntities();

    public CustomerViewModel(int id)
    {
        IEnumerable<CUSTOMER> customerList = from c in db.CUSTOMER
                                             where c.CUSTOMERNO== id
                                             select c;
        customer = customerList.First();

        var countryListTemp = new List<String>();
        var countryListQry = from s in db.COUNTRY
                             select s.COUNTRY_ABBREVIATION;
        countryListTemp.AddRange(countryListQry);
        countryList = new SelectList(countryListTemp);
    }
}

Тогда CustomerController.cs:

public ViewResult CustomerData(int id = 0)
{
    // if (id == 0) { ... }
    var viewModel = new CustomerViewModel(id);
    return View(viewModel);
}

[HttpPost]
public ActionResult CustomerData(CustomerViewModel model)
{
    db.Entry(model.customer).State = System.Data.EntityState.Modified;
    db.SaveChanges();
    return View(model);
}

И последнее, но не менее важное: CustomerData.cshtml:

@model MyApp.ViewModels.CustomerViewModel
@{
    ViewBag.Title = "Customer";
}
<h2>
    Customer</h2>
@using (Html.BeginForm("CustomerData", "Customer"))
{
    @Html.ValidationSummary(true)
    <div id="tabs">
        <ul>
            <li><a href="#data">Data</a></li>
            <li><a href="#hobbies">Hobbies</a></li>
            <li><a href="#stuff">Stuff</a></li>
        </ul>
        <div id="data">
            <div class="editor-label">
                @Html.Encode("Country:")
            </div>
            <div class="editor-field">
            @Html.DropDownListFor(m => m.country.COUNTRY_ABBREVIATION, Model.countryList, Model.customer.ADDRESS.COUNTRY.COUNTRY_ABBREVIATION)
            </div>
            <div class="editor-label">
                @Html.Encode("Last name:")
                @Html.TextBox("lastName", @Model.customer.ADDRESS.NAME)
            </div>
            <div class="editor-label">
                @Html.Encode("First Name:")
                @Html.TextBox("firstName", @Model.customer.ADDRESS.FIRSTNAME)
            </div>
        </div>
        <div id="hobbies">
            <p>
                Hobbies
            </p>
        </div>
        <div id="stuff">
            <p>
                Stuff
            </p>
        </div>
    </div>
    <p>
        <input type="submit" value="Save" />
    </p>
}

Просмотр работает отлично. Я попадаю на URL http://localhost:12345/Customer/CustomerData/4711 и вижу текущие значения для этого клиента.

Теперь мне не хватает некоторых вещей.

  1. Кнопка Сохранить не работает. Если я щелкну по нему, я получу сообщение об ошибке, что не найден конструктор без параметров для этого объекта. Но я хочу передать ViewModel обратно в контроллер. Как перегрузить метод Html.BeginForm ()?!

  2. Как сохранить измененные значения от клиента? Это делается путем редактирования текстовых полей или я должен использовать Html.TextboxFor () вместо Html.Textbox? Это так сложно для начинающего. Я совсем не в стиле LINQ.

  3. Выпадающий список работает не так, как должно. Страна, в которой находится клиент, уже находится в нем дважды. Похоже, что третий параметр не предзагружает элемент, а добавляет параметр по умолчанию. Html.Dropdownlist будет лучше?

1 Ответ

0 голосов
/ 28 ноября 2011

Боюсь, этот дизайн плохой. Никогда не делайте доступ к БД из модели, для этого и нужен Контроллер. Модель должна просто содержать данные, которые контроллер передает ей.

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

...