2015-10-02 4 views
0

Так вот некоторый код:значение пароля отсутствует после POST

Контроллер

[HttpGet] 
public ActionResult GetSettings() 
{ 
    var save = new SettingsSaver(); 
    var dto = save.GetSettings(); 
    var model = new SettingsModel 
    { 
     Password = dto.Password, 
     Port = dto.Port, 
     Username = dto.Username, 
     Enabled = dto.Enabled, 
     Id = dto.Id, 
     IpAddress = dto.IpAddress, 
    }; 

    return View(model); 
} 

[HttpPost] 
public ActionResult GetSettings(SettingsModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     var dto = new SettingsDto 
     { 
      IpAddress = viewModel.IpAddress, 
      Password = viewModel.Password, 
      Port = viewModel.Port, 
      Username = viewModel.Username, 
      Enabled = viewModel.Enabled, 
      Id = viewModel.Id 
     }; 

     var save = new SettingsSaver(); 
     var result = save.SaveSettings(dto); //Saves correctly and updates in DB 
     if (result) 
     { 
      return View(); // Returns this 
     } 
     return View("Error"); 
    } 
    return View("Error"); 
} 

View (По умолчанию Edit View)

@model Dash.UI.Models.Settings.SettingsModel 

@{ 
    ViewBag.Title = "Settings"; 
} 

<h2>Settings</h2> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Settings</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.Id) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Enabled, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <div class="checkbox"> 
        @Html.EditorFor(model => model.Enabled) 
        @Html.ValidationMessageFor(model => model.Enabled, "", new { @class = "text-danger" }) 
       </div> 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.IpAddress, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.IpAddress, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.IpAddress, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Port, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Port, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Port, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Username, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Username, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

Итак, что проблема в том, когда Я обновляю модель и POST до GetSettings все работает правильно, обновления в db e tc. но на return View() он не попадает в метод действия GetSettings(), но он возвращает представление со всей заполненной моделью, кроме пароля.

Модель

public class SettingsModel : BaseSettingsViewModel // Base contains ID and Enabled properties with no data annotations 
{ 
    [Required] 
    [DataType(DataType.Text)] 
    [DisplayName("IP Address")] 
    public string IpAddress { get; set; } 
    [Required] 
    [DisplayName("Port")] 
    public int Port { get; set; } 
    [Required] 
    [DataType(DataType.Text)] 
    [DisplayName("Username")] 
    public string Username { get; set; } 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Password")] 
    public string Password { get; set; } 
} 

Любые рекомендации/руководство будет высоко ценится.

ответ

2

После возвращения того же вида из POST, ModelState заполнит элементы управления (кроме полей пароля) из опубликованных значений.

Так что вам нужно Post-Redirect-Get шаблон:

if (result) 
{ 
    return RedirectToAction("GetSettings"); 
} 
+0

Почему кроме пароля? –

+0

По соображениям безопасности, я думаю. – CodeCaster

+0

Спасибо, я действительно должен это делать, чтобы остановить людей, которые нажимают F5 и повторно заполнять форму. Я соглашусь, когда смогу. –

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