Как только relu определено как:
max(features, 0)
, они в основном одинаковы. Оба принимают тензор в качестве входных данных и возвращают тензор. Разница лишь в поддерживаемых типах.
tf.nn.relu
поддерживает следующие типы:
float32
, float64
, int32
, uint8
, int16
, int8
, int64
, [ 119], uint16
, half
, uint32
, uint64
, qint8
, а tf.maximum
поддерживает подмножество вышеуказанных типов:
half
, float32
, float64
, int32
, int64
Соглашение уже доступно без особых трудностей. Хитрость заключается в том, чтобы связать значения TextBox на основе модели, которую вы передаете в представление.
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult CreatePost()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreatePost(FormCollection formCollection)
{
try
{
// do your logic here
// maybe u want to stop and return the form
return View(formCollection);
}
catch
{
// this will pass the collection back to the ViewEngine
return View(formCollection);
}
}
Далее происходит то, что ViewEngine принимает formCollection и сопоставляет ключи в коллекции с именами / значениями идентификаторов, которые есть в вашем представлении. , используя помощники Html. Например:
<div id="content">
<% using (Html.BeginForm()) { %>
Enter the Post Title: <%= Html.TextBox("Title", Model["Title"], 50) %><br />
Enter the Post Body: <%= Html.TextArea("Body", Model["Body"]) %><br />
<%= Html.SubmitButton() %>
<% } %>
</div>
Обратите внимание, что текстовое поле и текстовое поле имеют идентификаторы Title и Body? Теперь обратите внимание, как я устанавливаю значения из объекта View Model? Поскольку вы передали FormCollection (и вы должны установить строго типизированное представление с помощью FormCollection), теперь вы можете получить к нему доступ. Или, без строгой типизации, вы можете просто использовать ViewData ["Title"] (я думаю).
POOF Ваш волшебный ViewState. Эта концепция называется условием предпочтения конфигурации.
Теперь приведенный выше код находится в своей простейшей, самой сырой форме с использованием FormCollection. Все становится интересно, когда вы начинаете использовать ViewModels вместо FormCollection. Вы можете начать добавлять свою собственную проверку своих моделей / моделей представления и заставить контроллер автоматически выдавать пользовательские ошибки проверки. Однако это ответ на другой день.
Я бы посоветовал использовать PostFormViewModel вместо объекта Post, но для каждого свое. В любом случае, потребовав объект в методе действия, вы теперь получаете метод IsValid (), который вы можете вызвать.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreatePost(Post post)
{
// errors should already be in the collection here
if (false == ModelState.IsValid())
return View(post);
try
{
// do your logic here
// maybe u want to stop and return the form
return View(post);
}
catch
{
// this will pass the collection back to the ViewEngine
return View(post);
}
}
И ваше строго типизированное представление нужно будет настроить:
<div id="content">
<% using (Html.BeginForm()) { %>
Enter the Post Title: <%= Html.TextBox("Title", Model.Title, 50) %><br />
Enter the Post Body: <%= Html.TextArea("Body", Model.Body) %><br />
<%= Html.SubmitButton() %>
<% } %>
</div>
Вы можете пойти дальше и отображать ошибки также в представлении, непосредственно из ModelState, который вы установили в контроллере.
<div id="content">
<%= Html.ValidationSummary() %>
<% using (Html.BeginForm()) { %>
Enter the Post Title:
<%= Html.TextBox("Title", Model.Title, 50) %>
<%= Html.ValidationMessage("Title") %><br />
Enter the Post Body:
<%= Html.TextArea("Body", Model.Body) %>
<%= Html.ValidationMessage("Body") %><br />
<%= Html.SubmitButton() %>
<% } %>
</div>
Что интересно в этом подходе, так это то, что вы заметите, что я не устанавливаю сводку проверки или отдельные сообщения проверки в представлении . Мне нравится практиковать концепции DDD, что означает, что мои сообщения проверки (и сводки) контролируются в моем домене и передаются в виде коллекции. Затем я просматриваю коллекцию (если есть какие-либо ошибки) и добавляю их в текущую коллекцию ModelState.AddErrors. Остальное происходит автоматически, когда вы возвращаете View (сообщение).
Многие соглашения отсутствуют. Несколько книг, которые я настоятельно рекомендую, чтобы охватить эти шаблоны более подробно:
И именно в таком порядке первая описывает необработанные гайки и болты. всего фреймворка MVC. Последний охватывает передовые методы, не входящие в официальный список Microsoft, с несколькими внешними инструментами, которые значительно облегчат вашу жизнь (Castle Windsor, Moq и т. Д.).
Предполагается, что представление является тупым в паттерне MVC, просто отображая то, что дает ему Контроллер (очевидно, мы часто в конечном итоге получаем некоторую логику, но предпосылка заключается в том, что это не так), в результате элементы управления не ' Я несу ответственность за их состояние, оно будет приходить от контроллера каждый раз.
Я не могу рекомендовать книгу Стивена Сандерсона Pro ASP.NET MVC от Apress для того, чтобы разобраться с этим паттерном и его реализацией.
Ответ действительно зависит от типов элементов управления, для которых вы пытаетесь поддерживать состояние. Для базовых элементов управления Html очень легко поддерживать состояние с вашими моделями, для этого вам необходимо создать строго типизированное представление.
Итак, если бы у нас была модель User со свойствами: Имя пользователя, Полное имя, Электронная почта, мы могли бы сделать следующее в представлении:
<%= Html.ValidationSummary() %>
<% using (Html.BeginForm()) { %>
<fieldset>
<legend>User details</legend>
<%= Html.AntiForgeryToken() %>
<p>
<label for="Username">Username:</label>
<%= Html.Textbox("Username", Model.Username, "*") %>
</p>
<p>
<label for="FullName">FullName:</label>
<%= Html.Textbox("FullName", Model.FullName, "*") %>
</p>
<p>
<label for="Email">Email:</label>
<%= Html.Textbox("Email", Model.Email, "*") %>
</p>
<p>
<input type+"submit" value="Save user" />
</p>
</fieldset>
<% } %>
Тогда у нас было бы два действия контроллера, которые отображают это представление, один для получения и другой для сообщения:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult User()
{
return View(new User())
}
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult User([Bind(Include = "Username,FullName,Email")]User user)
{
if (!ModelState.IsValid()) return View(user);
try
{
user.save()
// return the view again or redirect the user to another page
}
catch(Exception e)
{
ViewData["Message"] = e.Message;
return View(user)
}
}
Это то, что вы ищете? Или вы хотите сохранить состояние моделей, которые не отображаются в форме между запросами?
Главное, что нужно помнить, это то, что ваш код выполняется на сервере во время запроса и завершается, единственная информация, которую вы можете передать между вашими запросами, это базовые данные HTML-формы, параметры URL и информация о сеансе.
Как уже упоминали другие, я настоятельно рекомендую Pro ASP.NET MVC Framework Стива Сандерсана для полного понимания работы с MVC Framework.
Я думаю, что лучший способ сделать это - сериализовать исходную модель в скрытое поле, затем десериализовать ее и обновить модель по почте. Это несколько похоже на подход с точки зрения состояния, только вы должны реализовать его самостоятельно. Я использую это:
сначала мне нужны некоторые методы, которые делают вещи проще:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using LuvDaSun.Extensions;
using System.Web.UI;
namespace LuvDaSun.Web.Mvc
{
public static class HtmlHelperExtensions
{
static LosFormatter _losFormatter = new LosFormatter();
public static string Serialize(this HtmlHelper helper, object objectInstance)
{
var sb = new StringBuilder();
using (var writer = new System.IO.StringWriter(sb))
{
_losFormatter.Serialize(writer, objectInstance);
}
return sb.ToString();
}
}
[AttributeUsage(AttributeTargets.Parameter)]
public class DeserializeAttribute : CustomModelBinderAttribute
{
public override IModelBinder GetBinder()
{
return new DeserializeModelBinder();
}
}
public class DeserializeModelBinder : IModelBinder
{
static LosFormatter _losFormatter = new LosFormatter();
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType.IsArray)
{
var type = bindingContext.ModelType.GetElementType();
var serializedObjects = (string[])bindingContext.ValueProvider.GetValue(bindingContext.ModelName).ConvertTo(typeof(string[]));
var deserializedObjects = Array.CreateInstance(bindingContext.ModelType.GetElementType(), serializedObjects.Length);
for (var index = 0; index < serializedObjects.Length; index++)
{
var serializedObject = serializedObjects[index];
var deserializedObject = _losFormatter.Deserialize(serializedObject);
deserializedObjects.SetValue(deserializedObject, index);
}
return deserializedObjects;
}
else
{
var serializedObject = (string)bindingContext.ValueProvider.GetValue(bindingContext.ModelName).ConvertTo(typeof(string));
var deserializedObject = _losFormatter.Deserialize(serializedObject);
return deserializedObject;
}
}
}
}
затем в моем контроллере у меня есть что-то вроде этого (для обновления продукта)
public ActionResult Update(string productKey)
{
var model = _shopping.RetrieveProduct(productKey);
return View(model);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Update([Deserialize]Shopping.IProduct _model, FormCollection collection)
{
UpdateModel(model);
model.Save();
return RedirectAfterPost();
}
и мне нужно скрытое поле, которое содержит сериализованный объект в форме:
<%
using (Html.BeginRouteForm("Product", FormMethod.Post, new { id = UniqueID, }))
{
%>
<%= Html.Hidden("Model", Html.Serialize(Model)) %>
<h1>
Product bewerken</h1>
<p>
<label for="<%=UniqueID %>_Name">
Naam:</label>
<input id="<%=UniqueID %>_Name" name="Name" type="text" value="<%= Html.AttributeEncode(Model.Name) %>"
class="required" />
<br />
</p>
<p>
Omschrijving:<br />
<textarea id="<%= UniqueID %>_Description" name="Description" cols="40" rows="8"><%= Html.Encode(Model.Description) %></textarea>
<br />
</p>
<p>
<label for="<%=UniqueID %>_Price">
Prijs:</label>
<input id="<%= UniqueID %>_Price" name="Price" type="text" value="<%= Model.Price.ToString("0.00") %>"
class="required" />
<br />
</p>
<ul class="Commands">
<li><a href="" class="ClosePopup">Annuleren</a></li>
<li>
<input type="submit" value="Opslaan" /></li>
</ul>
<%
}
%>
<script type="text/javascript">
jQuery('#<%= UniqueID %>').validate();
</script>
, как вы можете видеть, скрытое поле (модель) добавляется к форме. Содержит информацию сериализации для исходного объекта. Когда форма публикуется, скрытое поле также публикуется (конечно), и содержимое десериализуется пользовательским связывателем моделей в исходный объект, который затем обновляется и сохраняется контроллером.
Обратите внимание, что сериализуемый объект должен быть украшен атрибутом Serializable или иметь TypeConverter, который может преобразовывать объект в строку.
LosFormatter (ограниченная сериализация объектов) используется представлением состояния в веб-формах. Он также предлагает шифрование данных сериализации.
встречает ...
В веб-формах контрольные значения поддерживаются в состоянии просмотра, поэтому вам (теоретически) не нужно повторно инициализировать и тому подобное при каждой обратной передаче. Значения (опять же теоретически) поддерживаются платформой.
В ASP.NET MVC, если вы следуете парадигме, вам не нужно поддерживать состояние элементов формы. Значения элементов формы доступны по почте, где ваш контроллер может с ними работать (проверка, обновление базы данных и т. Д.). Для любых элементов формы, которые отображаются после обработки сообщения, вы (разработчик) несете ответственность за их инициализацию - фреймворк не делает этого автоматически.
Тем не менее, я читал о механизме под названием TempData, который позволяет вашему контроллеру передавать данные другому контроллеру после перенаправления.
Вызовы AJAX - это то, что мы делаем. Если вы говорите о сетках в целом, посмотрите JQGrid и то, как они рекомендуют реализацию AJAX.
скрытые поля, например:
<% using (Html.BeginForm (c => c.SomeAction (null))) {%>
<% = Html.Hidden ("SomeField", Model.SomeField)%>
<% = Html.Hidden ("AnotherField", Model.AnotherField)%>
установка конкретной модели и отсутствие каких-либо явных полей (дает u скрытых полей). В приведенном ниже примере модель заполняется контроллером значениями, полученными из последнего сообщения, поэтому на странице включается опция no js, которая может фильтровать по статусу:
Some Filter: <% using (Html. BeginForm (
c => c.SomeAction (model.SomeField, model.AnotherField, model.YetAnotherField, null, model.SomeOtherField)
)) {%>
<% = Html.DropDownList ("статус", Model.StatusSelectList)%>
<%}%>
Выше представлены различные независимые варианты для достижения этого, которые можно использовать в разных сценариях. Есть и другие параметры, о которых я не упомянул, например, файлы cookie, сеанс, хранить данные в базе данных (например, для возобновляемого многошагового мастера), параметры, передаваемые в действие.