2014-10-25 3 views
0

Я шифрую идентификатор, чтобы скрыть исходный идентификатор в строке запроса и передать его контроллеру. Но идентификатор не сохраняется в обратной обратной связи с контроллером.Зашифрованный идентификатор не сохраняется в контроллере

для например

/Vendor/EditVendor/mELirpUhRYksFj7k8-XBcQ%3d%3d 

DecryptLong() метод будет расшифровывать выше строка ID mELirpUhRYksFj7k8-XBcQ%3d%3d к 1

Контроллер

public ActionResult EditVendor(string id) 
    { 
     var vendor = _vendorService.GetVendorById(id.DecryptLong()); 

     return View(vendor); 
    } 

    [HttpPost] 
    public ActionResult EditVendor(Vendor vendor) 
    { 
     if (ModelState.IsValid) 
     { 
      vendor.Id -- it is always zero and not retaining back 
      _vendorService.EditVendor(vendor);  
     } 

     return View(vendor); 
    } 

В связи

@model Eclatech.KidsHub.Objects.Vendor 

@{ 
    ViewBag.Title = "EditVendor"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Edit Vendor</h2> 

@using(Html.BeginForm("EditVendor","Vendor",FormMethod.Post, new Dictionary<string, object> 
                  { 
                   {"class","form-horizontal"}, 
                   {"role","form"} 
                  })) 
{ 
    <div class="form-group"> 
     @Html.LabelFor(m => m.VendorName, new Dictionary<string, object> 
              { 
               {"class","col-sm-2 control-label"} 
              }) 
    <div class="col-sm-10"> 
     @Html.TextBoxFor(m => m.VendorName,new Dictionary<string, object> 
               { 
                {"class","form-control"} 
               }) 
    </div> 
</div> 

@Html.HiddenFor(m => m.Id) 
<input type="submit" class="btn btn-primary btn-default" value="Save" /> 
} 

Модель

public class Vendor : AuditableEntity<long> 
{ 
    public string VendorName { get; set; } 

    public virtual ICollection<Product> Products { get; set; } 
} 

public abstract class AuditableEntity<T> : Entity<T>, IAuditableEntity 
{ 
    [ScaffoldColumn(false)] 
    public DateTime CreatedDate { get; set; } 

    [MaxLength(256)] 
    [ScaffoldColumn(false)] 
    public string CreatedBy { get; set; } 

    [ScaffoldColumn(false)] 
    public DateTime UpdatedDate { get; set; } 

    [MaxLength(256)] 
    [ScaffoldColumn(false)] 
    public string UpdatedBy { get; set; } 
} 

public abstract class Entity<T> : BaseEntity, IEntity<T> 
{ 

    private static long _rowNumber; 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public virtual T Id { get; set; } 

    [NotMapped] 
    public virtual long RowNumber 
    { 
     get { return ++_rowNumber; } 

    } 
} 
+0

Это не очевидно из кода публикуемую. Добавьте определение модели и, возможно, больше представления. –

+0

@QuintonBernhardt, добавлена ​​модель и вид –

+0

Проверьте html, предоставленный '@ Html.HiddenFor (m => m.Id)' Я подозреваю, что это будет ' ' –

ответ

1

Проблема заключается в том, что ваше имя параметра для метода EditVendor называется id и вы возвращаете модель, которая также имеет свойство с именем id. Когда вы вызываете метод EditVendor, значение параметра добавляется к ModelState, которое переопределяет значение свойства Vendor.Id. Если вы проверите html, сгенерированный @Html.HiddenFor(m => m.Id), вы увидите, что значение входа mELirpUhRYksFj7k8-XBcQ%3d%3d, а не значение, возвращаемое DecryptLong(). Когда этот пост назад, он не может быть привязан к типу int, поэтому Id имеет значение по умолчанию, равное нулю.

Вы можете проверить это, добавив ModelState.Clear(); перед вызовом GetVendorById(). Это очистит значение Id и скрытое значение входов теперь будет 1. Для того, чтобы решить эту проблему, измените имя параметра, например

public ActionResult EditVendor(string vendorID) 
{ 
    var vendor = _vendorService.GetVendorById(vendorID.DecryptLong()); 
    return View(vendor); 
} 
Смежные вопросы