2015-12-12 5 views
0

Поскольку я обрабатываю 8 элементов, и всем им присваивается число, я хотел бы проанализировать это число модели и управлять этими данными с контроллера. Я пробовал это до сих пор, но я получаю исключение для исключения ссылок.Проанализируйте значение из представления в контроллер при щелчке MVC/C#

@{ 

     int[] myItems = { 1, 2, 3, 4, 5, 6, 7, 8 }; 
    } 

    @foreach (var item in myItems) 
    { 

     <div class="beds col-lg-3 col-md-4 col-sm-6 col-xs-12"> 
      <h4>Bed: @item</h4> //System null reference 
      <a data-toggle="modal" data-target="#myModal3"> 
        <img src='@Url.Content("~/Images/AWT-Bed.png")' onclick="@Model.ItemNumber = @item" /> 
      </a> 
     </div> 
    } 
+3

Что должно делать событие onclick? Вызов бэкэнда, сделайте внутреннюю магию? Если вы хотите вызвать действие контроллера, то '@ Url.Action ('action', 'controller', new {parameters}' будет вашим другом ... –

+0

@StephenReindl Я предполагаю, что новые {параметры} передают значение параметра для метода действия? –

+0

Вы смешиваете логику бэкэнд на своем лицевом конце. MVC не работает, как веб-формы. – axlj

ответ

3

Я думаю, вы неправильно поняли идею шаблонов MVC и Razor. Поток следующим образом:

Серверный

  1. Контроллер принимает данные от View, работает, создает модель (или лучше назвать ViewModel/DTO, как модель часто более сложная идея вовлечения datastorage решения)

  2. это ViewModel передается View Engine, где он оказанной в окончательном View, который передается Клиенту

стороны клиента

  1. Client (веб-браузер) отображает вид

  2. Клиент отправляет данные, возможно, собранные из поля зрения, не контролер на сервере

Там нет Прямая связь между ними, и вы не можете это сделать:

onclick="@Model.ItemNumber = @item" 

Сторона сервера и клиентская сторона разделены через канал связи без состояния (протокол HTTP), без использования сложных методов, таких как websockets и т. Д., Нет прямой связи между этими двумя. Сервер отображает представление, основанное на данных ViewModel, полученных от контроллера, отправляет его клиенту и забывает об этом.

Я не знаю, что вы пытаетесь достичь, но попробовать это:

контроллер на стороне сервера

public class ViewModel 
{ 
    public int? SelectedItem { get; set; } 
    public int[] MyItems { get; set; } 
} 

public class MyController : Controller 
{ 
    [HttpGet] 
    public ActionResult MyAction(int? selectedItem = null) 
    { 
     // Here you create your ViewModel and pass it to the View Engine to render 
     ViewModel viewModel = new ViewModel() 
     { 
      SelectedItem = selectedItem, 
      MyItems = { 1, 2, 3, 4, 5, 6, 7, 8 }, 
     }; 

     return View(viewModel); 
    } 
} 

Посмотреть, redenred на стороне сервера, но на экране клиента сторона

@model ViewModel 

    <h3>Currently selected item is: @(Model.SelectedItem != null ? Model.SelectedItem.Value.ToString() : "none selected yet")</h3> 

    @foreach (int item in Model.MyItems) 
    { 
      <div class="beds col-lg-3 col-md-4 col-sm-6 col-xs-12"> 
        <h4>Bed: @item</h4> 
        <a data-toggle="modal" data-target="#myModal3"> 
          <a href="@Url.Action('MyAction', new { selectedItem = item })"><img src='@Url.Content("~/Images/AWT-Bed.png")'/></a> 
        </a> 
      </div> 
    } 

Как вы можете видеть, контроллер принимает входные параметры «S selectedItem "(который является нулевым, если действие вызывается без параметров, как при первом входе пользователя на вашу страницу). Он готовит ViewModel, который передается в ViewEngine.

Там это визуализируется. У нас есть цикл, который создает HTML со ссылками и изображениями. Затем этот HTML-код отправляется в веб-браузер клиента. Если пользователь нажимает на изображение, браузер снова вызывает ваш контроллер, передавая входной параметр «selectedItem», который снова передается в представление и т. Д.

Конечно, это было бы полезно для технологии AJAX, но на этом примере показано базовое правило веб-страниц - это статические, безгосударственные вещи. Вы вызываете действие на сервере, можете передавать параметры в качестве входных данных, получать результат.Никакая магия не присваивает этому значению этой переменной модели, когда пользователь нажимает что-нибудь ». Модель (как и все) является временной и существует только тогда, когда выполняется действие контроллера, и представление отображается внутри механизма просмотра. После этого он отправляется в браузер и все удаляется из памяти.

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