2010-01-16 4 views
0

я вроде застрял с этим кодом:модель привязки в ASP.NET MVC при редактировании сущность

[AcceptVerbs(HttpVerbs.Post), Authorize] 
    public ActionResult Edit(FormCollection collection, [Bind(Exclude="Id,Latitude,Longitude")]Store bindStore, string Latitude, string Longitude) 
    { 
     Store st = storeModel.GetStore(Session["user_id"].ToString()); 
     bool modelUpdate = TryUpdateModel(st, new string[] { "Storename", "Address1", "Address2", "Zipcode", "City", "Phone1", "Phone2", "Store_email", "Store_homepage", "Pm_ec", "Pm_visa", "Pm_master", "Appointment_requirement", "Short_user_store_description" }); 

     if (ModelState.IsValid) 
     { 
      storeModel.Save(); 
      return RedirectToAction("ImageUpload"); 
     } 
     else 
      return Edit(); 
    } 

Моя проблема в том, что я не знаю, Что правильный способ сделать ModelBinding, когда мне нужны эти условия совпадают:

  • объект «магазин» имеет несколько полей (не только Id), которые не должны быть обновлены в течение этого обновления (были проблемы, что «TryUpdateModel» NULL-IFIES все эти поля, так я добавил значение «includeProperties» с открытым текстом всех параметров .. решение, которое мне не нравится, в любом случае)
  • Получение идентификатор магазина из сессии, как я не хочу, чтобы это было в HTML
  • Изготовление InputValidation через DataAnnotationModel (см ниже)

    [MetadataType(typeof(StoreMetaData))] 
    public partial class Store 
    { 
    } 
    
    public class StoreMetaData 
    { 
        [Required] 
        [StringLength(5)] 
        public object Storename { get; set; } 
    } 
    

Вопрос: Является ли это правильный подход или есть стандартное/более приятное решение для такого рода проблем?

ответ

0

Я полагаю, что, глядя на код, который вы опубликовали, вы пытаетесь сделать так, чтобы вид редактирования разрешал редактирование определенных полей, но «проходил» те, которые вы не используете хочу измениться. В этом случае вы можете изменить свой вид редактирования, чтобы удалить эти поля из редактируется, но все-таки отправить их в форму с помощью:

<%= Html.Hidden("field") %> 

Позвольте мне знать, если это то, что вы хотели.

+0

нет, позволяет сказать, что есть более чем 1 вид и как обновление 50% полей магазина объекта .. – David

+0

являются виды обновляющие одни и те же данные? Можете ли вы подробнее рассказать о своем оригинальном посте со структурой своей программы? –

+0

Я предполагаю, что вы меня не поняли .. речь идет не о представлениях (они просто содержат «некоторые» из полей объекта «store»). Запрос HTTP-Post содержит эти поля, а ModelBinder устанавливает все остальные поля в параметр "bindStore" равен нулю. – David

1

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

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

0

Ваш путь в порядке ИМХО.

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

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

public ActionResult Edit(SlimStoreViewmodel editStoreModel, string Latitude, string Longitude) 
{ 
    Store st = storeModel.GetStore(Session["user_id"].ToString()); 

    if (ModelState.IsValid) 
    {    
     st.Thing = editStoreModel.Thing; 
     st.Thing2 = editStoreModel.Thing2; 
     st.Widget = editStoreMOdel.Widget; 

     storeModel.Save(); 
     return RedirectToAction("ImageUpload"); 
    } 
    else 
     return Edit(); 
} 

Это избавляется долго магия струнные плотные вещи, как это:

TryUpdateModel(st, new string[] { "Storename", "Address1", "Address2", "Zipcode", "City", "Phone1", "Phone2", "Store_email", "Store_homepage", "Pm_ec", "Pm_visa", "Pm_master", "Appointment_requirement", "Short_user_store_description" }); 
+0

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

Смежные вопросы