ASP.NET MVC и ViewState

Как только relu определено как:

max(features, 0)

, они в основном одинаковы. Оба принимают тензор в качестве входных данных и возвращают тензор. Разница лишь в поддерживаемых типах.

tf.nn.relu поддерживает следующие типы:

  • float32, float64, int32, uint8, int16, int8, int64, [ 119], uint16, half, uint32, uint64, qint8

, а tf.maximum поддерживает подмножество вышеуказанных типов:

    [ 1122] half, float32, float64, int32, int64
17
задан Community 23 May 2017 в 12:01
поделиться

7 ответов

Соглашение уже доступно без особых трудностей. Хитрость заключается в том, чтобы связать значения 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 и т. Д.).

16
ответ дан 30 November 2019 в 12:27
поделиться

Предполагается, что представление является тупым в паттерне MVC, просто отображая то, что дает ему Контроллер (очевидно, мы часто в конечном итоге получаем некоторую логику, но предпосылка заключается в том, что это не так), в результате элементы управления не ' Я несу ответственность за их состояние, оно будет приходить от контроллера каждый раз.

Я не могу рекомендовать книгу Стивена Сандерсона Pro ASP.NET MVC от Apress для того, чтобы разобраться с этим паттерном и его реализацией.

4
ответ дан 30 November 2019 в 12:27
поделиться

Ответ действительно зависит от типов элементов управления, для которых вы пытаетесь поддерживать состояние. Для базовых элементов управления 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.

3
ответ дан 30 November 2019 в 12:27
поделиться

Я думаю, что лучший способ сделать это - сериализовать исходную модель в скрытое поле, затем десериализовать ее и обновить модель по почте. Это несколько похоже на подход с точки зрения состояния, только вы должны реализовать его самостоятельно. Я использую это:

сначала мне нужны некоторые методы, которые делают вещи проще:

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 (ограниченная сериализация объектов) используется представлением состояния в веб-формах. Он также предлагает шифрование данных сериализации.

встречает ...

2
ответ дан 30 November 2019 в 12:27
поделиться

В веб-формах контрольные значения поддерживаются в состоянии просмотра, поэтому вам (теоретически) не нужно повторно инициализировать и тому подобное при каждой обратной передаче. Значения (опять же теоретически) поддерживаются платформой.

В ASP.NET MVC, если вы следуете парадигме, вам не нужно поддерживать состояние элементов формы. Значения элементов формы доступны по почте, где ваш контроллер может с ними работать (проверка, обновление базы данных и т. Д.). Для любых элементов формы, которые отображаются после обработки сообщения, вы (разработчик) несете ответственность за их инициализацию - фреймворк не делает этого автоматически.

Тем не менее, я читал о механизме под названием TempData, который позволяет вашему контроллеру передавать данные другому контроллеру после перенаправления.

3
ответ дан 30 November 2019 в 12:27
поделиться

Вызовы AJAX - это то, что мы делаем. Если вы говорите о сетках в целом, посмотрите JQGrid и то, как они рекомендуют реализацию AJAX.

0
ответ дан 30 November 2019 в 12:27
поделиться
  • скрытые поля, например:

     <% 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)%>
     
     <%}%>
    
  • используйте методы расширения для создания полей, если вы просто хотите, чтобы поля были заполнены опубликованными значениями, когда вы показываете неудачные сообщения проверки в отправленной форме
  • на asp.net mvc 2 они представили способ сохранения экземпляра в скрытом поле ... закодированный + (я думаю) подписанный
  • TempData, если все вышеперечисленное не делает этого (проходит через сеанс - очищается при следующем запросе)
  • , как уже упоминалось, при использовании ajax состояние уже есть в ранее загруженных полях на сайте клиента. Если u l8r необходимо сделать полную публикацию, обновите любое поле u, которое может потребоваться, с помощью вашего js.

Выше представлены различные независимые варианты для достижения этого, которые можно использовать в разных сценариях. Есть и другие параметры, о которых я не упомянул, например, файлы cookie, сеанс, хранить данные в базе данных (например, для возобновляемого многошагового мастера), параметры, передаваемые в действие.

3
ответ дан 30 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: