Это более короткий вариант принятого ответа: нижеприведенная функция извлекает биты от-до включительно, создавая битовую маску. После применения логики AND над исходным числом результат сдвигается, поэтому функция возвращает только извлеченные биты. Пропущены проверки индекса / целостности для ясности.
uint16_t extractInt(uint16_t orig16BitWord, unsigned from, unsigned to)
{
unsigned mask = ( (1<<(to-from+1))-1) << from;
return (orig16BitWord & mask) >> from;
}
Я начал работать с ASP.NET MVC, поэтому я натолкнулся на эту тему, поэтому я не уверен, что вы все еще проверяете улучшения.
Я не знаю Мне не нравится идея добавления нового свойства к частичному классу в структуре сущностей, потому что это не допускает столько изменений. Попробуйте пометить свой Deparment DropDown «Department.Id» следующим образом
<p>
<label for="Department.Id">Department:</label>
<%= Html.DropDownList("Department.Id", new SelectList((IEnumerable)ViewData["Departments"], "Id", "Name"))%>
</p>
ModelBinding MVC Framework получит значение и применит его к свойству «Id» свойства навигации «Department». Я обнаружил, что другие значения Department равны нулю, но это не важно. Теперь у вас есть способ получить правильную сущность отдела и применить ее к свойству навигации по отделу новой сущности человека, созданной в модели привязки к вашему параметру действия, примерно так:
newPerson.Department = ctx.Department.First(d => d.DepartmentId == newPerson.Department.Id);
Делая это таким образом, вы не необходимо вообще обновить свой объект, чтобы получить свойство, которое у него должно быть.
Улучшите свой контроль редактирования, чтобы он обрабатывал исключения, которые являются брошен и повторно отображает ввод, введенный пользователем. Я уверен, что вы собирались это сделать;)
Обновите свое представление, добавив валидаторы:
<label for="Name">Name:</label>
<%= Html.TextBox("Name", Model.Name) %>
<%= Html.ValidationMessage("Name", "*") %>
, а затем используйте их при редактировании:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Person Model)
{
try
{
ctx.AttachUpdated(Model); //extension
ctx.SaveChanges();
return RedirectToAction("Index");
}
catch
{
foreach (var err in Model.Errors)
ModelState.AddModelError(err.PropertyName, err.ErrorMessage)
return View(Model);
}
}