2013-10-11 4 views
0

Я новичок в MVC, и я использую Razor. У меня есть форма, где пользователь может редактировать текстовые поля, а затем - сохранять. Вот моя формаhtml.TextArea() значение после PostBack

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "form" })) 
{ 
    ... 
    @Html.TextArea("Description", Model.Description, 5, 50, null) 
    ... 
} 

После того как я проверил это и подтвердил, что он работает, я добавил проверку на стороне сервера. В поле описания я проверил, что он не был пустым. Если это не было, тогда отобразится сообщение об ошибке. Вот мой код для этого

[HttpPost] 
public ActionResult EditContract(Contract contract) 
{ 
    if (contract.Description == null) 
    { 
     contract.Description = string.Empty; 
    } 
    contract.Description = contract.Description.Trim(); 

    if (contract.Description == string.Empty) 
    { 
     ViewBag.Message = "Description can't be blank"; 

     contract.LoadContract(contract.ContractId); 

     return View(contract); 
    } 
    ... 
} 

Это фактически все работало так, как я хотел. Однако я был удивлен, что это произошло. Мой код загрузил запись из базы данных и передал ее в виде модели. Как было известно, что представление не устанавливает значение текстового поля в значение из модели и оставляет его в качестве последнего пользователя?

EDIT

Я создал простой проект, чтобы проверить это думать что-то в моем проекте может быть осуществление, как это работает. Этот простой проект представляет собой пустой проект MVC 4 с использованием бритвы. Затем я добавил следующий код.

MyModel.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace MvcApplication6.Models 
{ 
    public class MyModel 
    { 
     public string Name { get; set; } 
    } 
} 

HomeController.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MvcApplication6.Models; 

namespace MvcApplication6.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      var myModel = new MyModel(); 
      return View(myModel); 
     } 

     [HttpPost] 
     public ActionResult Index(MyModel model) 
     { 
      model.Name = "something"; 
      return View(model); 
     } 
    } 
} 

Index.cshtml

@model MvcApplication6.Models.MyModel 

@using (Html.BeginForm()) 
{ 
    @Html.TextBoxFor(model => model.Name) 
    <br /> 
    <input type="submit" value="submit" /> 
} 

Я хотел бы, чтобы показать 'что-то' в текстовом поле после того, как пользователь нажмет submit, но это не так. Он имеет то, что ранее вводил пользователь. Что мне нужно сделать, чтобы показать «что-то»?

Спасибо,

+0

Как в сторону, посмотрите на String.IsNullOrWhitespace() и сохраните себе несколько ключевых штрихов. –

+0

Спасибо. Этот фрагмент будет короче, если бы я использовал IsNullOfWhitespace(). Как бы то ни было, мне все равно нужно иметь if/else позже для проверки нулевой или этой строки 'command.Parameters.Add (новый SqlParameter («@ Description», contract.Description)); будет выдавать исключение, описание будет null. То, как у меня будет, будет на 1 строку короче. Кроме того, это шаблон, который я использовал в обычном ASP.NET для передачи «очищенных» значений обратно пользователю, если проверка не выполняется. Однако, поскольку MVC, похоже, хочет использовать то, что пользователь ввел последним, а не то, что в модели, я не уверен, как это получится. –

+0

Можете ли вы установить точку останова на своей обратной линии и проверить, чтобы увидеть значение 'contract.Description' в этой точке? –

ответ

0

Обычно, если я хочу, поле передается обратно в контроллер, я буду использовать для помощника

@Html.TextAreaFor(x => x.Description, ...) 

Это будет заполнить поле с данными модели, и если поле изменено, измененное значение - это то, что отправляется обратно контроллеру. Я нашел с помощью помощников «для», если я назвал поле таким же, как мое имя модели (как и вы), он все равно передаст измененное значение обратно в контроллер. MVC привязывает значение к полю при загрузке, но то, что отправляется обратно на контроллер, - это только измененные значения. Надеюсь, это поможет :)

+0

Хмм, TextArea и TextAreaFor, похоже, делают то же самое. Тем не менее, мне нравится TextAreaFor лучше, так как это сильно тип. Я думаю, что это цель * для функций.Я думаю, я буду использовать их больше с этого момента. Хотя это действительно не отвечает на мой вопрос. Я предполагаю, что мой пример выше работает так же, как и функции TextBox делают разные вещи на основе того, является ли текущий метод http HttpPost или HttpGet. Если HttpGet использует значение из моей модели, и если HttpPost использует то, что пользователь в последний раз ввел. Наверное, я искал подтверждения этого. –

+0

Мое понимание - это получение и отправка по почте тех же данных, разница в том, как данные отправляются. Я никогда не видел разницы в данных, отправленных между двумя разными методами. –

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