2013-07-24 4 views
0

Я пытаюсь обновить выбранные поля с помощью viewmodel (OApplyIDViewModel) исходной модели (OApply). Когда я запускаю изменения, не выполняются. Я буду благодарен всем, у кого есть опыт. Я не ошибаюсь. Форма отправляет и перенаправляет.Использование Automapper для редактирования выбранных полей модели MVC4

У меня есть это на global.asax

AutoMapper.Mapper.CreateMap<OApplyIDViewModel, OApply>(); 

Это ViewModel

public class OApplyIDViewModel 
{ 
    [Key] 
public int OAId { get; set; } 

[Display(Name = "Identification")] 
[Required(ErrorMessage = "Identification Required")] 
public int IdId { get; set; } 

[Display(Name = "Identification Number")][Required(ErrorMessage="ID Number Required")] 
public string AIdentificationNo { get; set; } 

[Display(Name = "Licence Version(5b)")] 
[RequiredIf("IdId", Comparison.IsEqualTo, 1, ErrorMessage = "Version(5b) Required")] 
public string ALicenceVersion { get; set; } 

    public int CountryId { get; set; } 
    [RequiredIf("IdId",Comparison.IsNotEqualTo,1, ErrorMessage="Country Required")] 

    [Display(Name = "Your Electronic Signature Date Seal")] 
    [Required(ErrorMessage="Date Signature Seal Required")] 
    public DateTime SigDate { get; set; } 
    [ScaffoldColumn(false)] 
    [Display(Name = "Last Updated on")] 
    public DateTime UDate { get; set; } 
    [ScaffoldColumn(false)] 
    [Display(Name = "Last Updated by")] 
    public String UDateBy { get; set; } 
    } 

Это на контроллере

// GET

 public ActionResult ClientEditID(int id) 
    { 
    var model = new OApplyIDViewModel(); 
    OApply oapply = db.OApply.Find(id); 
    if (model == null) 
    { 

     return HttpNotFound(); 
    } 
    ViewBag.CountryId = new SelectList(db.Countries, "CountryId", "CountryName", model.CountryId); 
    ViewBag.IdId = new SelectList(db.PhotoIds, "IdId", "IdName", model.IdId); 
    return View(); 
     } 


[HttpPost] 
    public ActionResult ClientEditId(OApplyIDViewModel oapply, int Id) 
    { 
    if (!ModelState.IsValid) 
    { 
    return View(oapply); 
    } 

    var onlineid = db.OApply.Where(x => x.OAId == Id).FirstOrDefault(); 
    Mapper.Map<OApplyIDViewModel,OApply>(oapply); 
    oapply.UDateBy = Membership.GetUser().ProviderUserKey.ToString(); 
    oapply.UDate = DateTime.Now; 
    db.Entry(onlineid).State= EntityState.Modified; 
    db.SaveChanges(); 
    ViewBag.CountryId = new SelectList(db.Countries, "CountryId", "CountryName", oapply.CountryId); 
    ViewBag.IdId = new SelectList(db.PhotoIds, "IdId", "IdName", oapply.IdId); 
    return RedirectToAction("HomeAccount"); 

}

Это Посмотреть

@using (Html.BeginForm("ClientEditId", "OApply", FormMethod.Post, new { enctype = "multipart/form-data", @class = "stdform" })) 
    { 
    @Html.ValidationSummary(true) 
     <fieldset> 
    <legend>OnlineApplication</legend> 
     @Html.HiddenFor(model => model.OAId) 

    <div class="related"> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.IdId, "IdType") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("IdId", String.Empty) 
     @Html.ValidationMessageFor(model => model.IdId) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.AIdentificationNo) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.AIdentificationNo) 
     @Html.ValidationMessageFor(model => model.AIdentificationNo) 
    </div> 

    <div class="requiredfields"> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.ALicenceVersion) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.ALicenceVersion) 
     @Html.ValidationMessageFor(model => model.ALicenceVersion) 
    </div> 
    </div> 
    <div class="country"> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.CountryId) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("CountryId") 
     @Html.ValidationMessageFor(model => model.CountryId) 
    </div> 
    </div></div> 
     <div class="editor-label"> 
     @Html.LabelFor(model => model.SigDate) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.SigDate) 
     @Html.ValidationMessageFor(model => model.SigDate) 
    </div> 

    <p> 
     <input type="submit" value="Save" /> 
    </p> 

ответ

0

Существует что-то здесь не так:

var onlineid = db.OApply.Where(x => x.OAId == Id).FirstOrDefault(); 
-> Mapper.Map<OApplyIDViewModel,OApply>(oapply); 
    oapply.UDateBy = Membership.GetUser().ProviderUserKey.ToString(); 
    oapply.UDate = DateTime.Now; 
    db.Entry(onlineid).State= EntityState.Modified; 

Линия со стрелкой возвращает новый экземпляр OApply. Он не обновляет onlineid. На самом деле он понятия не имеет о onlineid. Попробуйте следующее.

Mapper.Map<OApplyIDViewModel,OApply>(oapply, onlineid); 

Теперь он будет изменять onlineid вместо того, чтобы его возвращать. Однако вы должны игнорировать сопоставление первичного ключа, если это identity (автоинкрементный).

AutoMapper.Mapper.CreateMap<OApplyIDViewModel, OApply>() 
    .ForMember(dest => dest.OAId, opt => opt.Ignore()); 

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


Я внес исправления в коде:

public ActionResult ClientEditID(int id) 
{ 
OApply oapply = db.OApply.Find(id); 

->if (oapply == null) 
{ 
    return HttpNotFound(); 
} 
->var model = Mapper.Map<OApply, OApplyIDViewModel>(oapply); 

ViewBag.CountryId = new SelectList(db.Countries, "CountryId", "CountryName", model.CountryId); 
ViewBag.IdId = new SelectList(db.PhotoIds, "IdId", "IdName", model.IdId); 

->return View(model); 
    } 

HttpPost Ваш основном действует, за исключением того, что вы поместили данные в ViewBag, прежде чем использовать RedirectToAction(). Эти данные будут потеряны. Вместо этого используйте словарь TempData. Проверьте msdn.

+0

Большое спасибо. Я внедрил ваши предложения и очистил код другим. При доступе к представлению я получаю пустое представление Get. Я обновил код, чтобы включить просмотр, если бы вы могли помочь спасибо – Diin

+0

@Diin проверить мои изменения. – mostruash

+0

Thanks @mostruash Теперь в настоящее время отображается представление, но я получаю сообщение об ошибке. Элемент ViewData, который имеет ключ «CountryId», имеет тип «System.Int32», но должен иметь тип «IEnumerable ». – Diin

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