Я строю свои сущности через базу данных в первую очередь, так как я должен использовать существующую базу данных.
Теперь, допустим, у меня есть клиент и страна и я хочу отредактировать клиента.
Мое представление должно содержать что-то вроде имени, фамилии и страны, которые представляют собой выпадающий список из всех стран в организации.
Для этого я создал 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 и вижу текущие значения для этого клиента.
Теперь мне не хватает некоторых вещей.
Кнопка Сохранить не работает. Если я щелкну по нему, я получу сообщение об ошибке, что не найден конструктор без параметров для этого объекта. Но я хочу передать ViewModel обратно в контроллер. Как перегрузить метод Html.BeginForm ()?!
Как сохранить измененные значения от клиента? Это делается путем редактирования текстовых полей или я должен использовать Html.TextboxFor () вместо Html.Textbox? Это так сложно для начинающего. Я совсем не в стиле LINQ.
Выпадающий список работает не так, как должно. Страна, в которой находится клиент, уже находится в нем дважды. Похоже, что третий параметр не предзагружает элемент, а добавляет параметр по умолчанию. Html.Dropdownlist будет лучше?