MVC Razor Скрытые входные и передаваемые значения
Я уверен, что я делаю что-то неправильно здесь. За последние 2 месяца мы разрабатывали веб-приложение с использованием MVC и Razor, и мы никогда не думали использовать элемент формы. Теперь уже сделано много мастер-страниц и подстраниц, что означает реструктуризацию большей части нашего кода, чтобы использовать элемент формы, и это приведет к созданию нескольких элементов формы на странице.
В стороне, в Asp.Net, если я хотел получить доступ к любому элементу управления в коде С#, я мог бы просто указать ему ID = "SomeID" и RUNAT = "SERVER". Затем в моем коде я мог установить его значение и свойства.
Когда я делаю это в Razor, мы используем строки вроде:
<input id="hiddenPostBack" runat="server" type="hidden" />
Почему я не могу получить доступ к этому в контроллере? Я хочу обнаружить postback и установить значение false, если это первый раз, когда загружается страница, а если нет, установите значение true. Затем, основываясь на этом, я буду читать его либо на стороне сервера, либо на стороне клиента и что-то делать.
Мой реальный вопрос: как мне "что-то делать" на стороне сервера и на стороне клиента, учитывая, что у меня нет элемента формы. У меня создалось впечатление, что если я захочу передать значения от клиента к серверу и обратно, самый простой способ сделать это - со скрытым вводом. Но я просто не понимаю, как это сделать с MVC3 и бритвой.
Заранее благодарим за помощь.
Ответы
Ответ 1
Переход от WebForms к MVC требует полного изменения моря в логических и мозговых процессах. Вы больше не взаимодействуете с "формой" как на стороне сервера, так и на стороне клиента (и на самом деле даже с WebForms, с которыми вы не взаимодействовали на стороне клиента). Вероятно, вы просто немного смешались с тем, что с помощью WebForms и RUNAT="SERVER"
вы просто взаимодействовали со зданием веб-страницы.
MVC несколько похож на то, что у вас есть код на стороне сервера при построении модели (данные, необходимые для создания того, что увидит ваш пользователь), но как только вы создали HTML-код, вам нужно понять, что ссылка между сервером и пользователь больше не существует. У них есть страница HTML, что она.
Таким образом, HTML, который вы создаете, доступен только для чтения. Вы передаете модель на страницу Razor, которая построит HTML, соответствующий этой модели.
Если вы хотите иметь скрытый элемент, который устанавливает true или false, в зависимости от того, является ли это первым представлением или нет, вам нужна bool в вашей модели и установите значение True в действии, если оно будет реагировать на последующие действия, Это можно сделать с помощью различных действий в зависимости от того, является ли запрос [HttpGet] или [HttpPost] (если это подходит для настройки вашей формы: запрос GET для первого посещения и запрос POST при отправке формы).
В качестве альтернативы для модели может быть установлено значение Истина, когда она будет создана (которая будет в первый раз, когда вы заходите на страницу), но после проверки значения как True или False (поскольку bool по умолчанию False при его создании). Затем используя:
@Html.HiddenFor(x => x.HiddenPostBack)
в вашей форме, в результате чего будет скрыто True. Когда форма будет отправлена обратно на ваш сервер, у модели теперь будет установлено значение True.
Трудно дать гораздо больше советов, чем это, потому что ваш вопрос не определен относительно того, почему вы хотите это сделать. Возможно, важно, чтобы вы прочитали хорошую книгу о переходе на MVC из WebForms, например, Стив Сандерсон Про ASP.NET MVC.
Ответ 2
Если вы используете Razor, вы не можете получить доступ к полю напрямую, но вы можете управлять его значением.
Идея состоит в том, что первый подход Microsoft отвлекает разработчиков от веб-разработки и упрощает программирование на рабочем столе (например) для создания веб-приложений.
Между тем, веб-разработчики, не понимали этого сложного странного способа ASP.NET.
Фактически этот скрытый ввод отображается на стороне клиента, и ASP не имеет к нему доступа (он никогда не был). Однако со временем вы увидите его пиратский путь, и вы можете положиться на него, когда вы будете использовать его. Веб-разработка отличается от Desktop или Mobile.
Модель - это ваша логическая единица, а скрытое поле (и вся страница просмотра) - это просто репрезентативный вид данных. Таким образом, вы можете посвятить свою работу логике приложения или домена, и представление просто служит для потребителя - это означает, что вам не нужны подробный доступ и функциональность "мозгового штурма" в представлении.
Контроллер действительно работает для управления скрытой или общей настройкой. Модель удовлетворяет определенным свойствам и функциональным возможностям логического блока, и представление просто передает его конечному пользователю, просто сказано. Подробнее о MVC.
Model
public class MyClassModel
{
public int Id { get; set; }
public string Name { get; set; }
public string MyPropertyForHidden { get; set; }
}
Это контроллер aciton
public ActionResult MyPageView()
{
MyClassModel model = new MyClassModel(); // Single entity, strongly-typed
// IList model = new List<MyClassModel>(); // or List, strongly-typed
// ViewBag.MyHiddenInputValue = "Something to pass"; // ...or using ViewBag
return View(model);
}
Вид ниже
//This will make a Model property of the View to be of MyClassModel
@model MyNamespace.Models.MyClassModel // strongly-typed view
// @model IList<MyNamespace.Models.MyClassModel> // list, strongly-typed view
// ... Some Other Code ...
@using(Html.BeginForm()) // Creates <form>
{
// Renders hidden field for your model property (strongly-typed)
// The field rendered to server your model property (Address, Phone, etc.)
Html.HiddenFor(model => Model.MyPropertyForHidden);
// For list you may use foreach on Model
// foreach(var item in Model) or foreach(MyClassModel item in Model)
}
// ... Some Other Code ...
Вид с ViewBag:
// ... Some Other Code ...
@using(Html.BeginForm()) // Creates <form>
{
Html.Hidden(
"HiddenName",
ViewBag.MyHiddenInputValue,
new { @class = "hiddencss", maxlength = 255 /*, etc... */ }
);
}
// ... Some Other Code ...
Мы используем Html Helper для визуализации скрытого поля, или мы можем написать его вручную - <input name=".." id=".." value="ViewBag.MyHiddenInputValue">
.
ViewBag - это своего рода носитель данных для представления. Он не ограничивает вас моделью - вы можете разместить все, что захотите.
Ответ 3
Как вы уже могли понять, Asp.Net MVC - это другая парадигма, чем Asp.Net(webforms). Доступ к элементам формы между сервером и клиентом использует другой подход в Asp.Net MVC.
Вы можете сделать больше материалов для чтения в Google в Интернете. На данный момент я бы предложил использовать Ajax для получения или отправки данных на сервер. Вы все еще можете использовать input type="hidden"
, но инициализируйте его значением из ViewData
или для Razor, ViewBag
.
Например, ваш контроллер может выглядеть так:
public ActionResult Index()
{
ViewBag.MyInitialValue = true;
return View();
}
По вашему мнению, у вас может быть входной элемет, который инициализируется значением в ViewBag
:
<input type="hidden" name="myHiddenInput" id="myHiddenInput" value="@ViewBag.MyInitialValue" />
Затем вы можете передавать данные между клиентом и сервером через ajax. Например, используя jQuery:
$.get('GetMyNewValue?oldValue=' + $('#myHiddenInput').val(), function (e) {
// blah
});
В качестве альтернативы вы можете использовать $.ajax
, $.getJSON
, $.post
в зависимости от вашего требования.
Ответ 4
Прежде всего ASP.NET MVC работает не так, как это делает WebForms. У вас нет всего тэга runat="server"
. MVC не предлагает уровень абстракции, который предлагает WebForms. Probabaly, вы должны попытаться понять, какие контроллеры и действия есть, и тогда вы должны посмотреть на привязку модели. Любой учебник начального уровня о MVC показывает, как вы можете передавать данные между клиентом и сервером.
Ответ 5
Вы делаете это неправильно, поскольку пытаетесь сопоставить WebForms в приложении MVC.
В MVC нет контрольных элементов на стороне сервера. Только HTML (View) и Контроллер на задней панели. Вы отправляете данные с сервера на клиент средство инициализации View с вашей моделью.
Это происходит по запросу HTTP GET на ваш ресурс.
[HttpGet]
public ActionResult Home()
{
var model = new HomeModel { Greeatings = "Hi" };
return View(model);
}
Вы отправляете данные с клиента на сервер посредством отправки данных в сервер. Чтобы это произошло, вы создаете форму внутри своего представления и Обработчик [HttpPost] в вашем контроллере.
// View
@using (Html.BeginForm()) {
@Htmt.TextBoxFor(m => m.Name)
@Html.TextBoxFor(m => m.Password)
}
// Constoller
[HttpPost]
public ActionResult Home(LoginModel model)
{
// do auth.. and stuff
return Redirect();
}