2015-01-06 5 views
1

Я начинаю изучать asp.net MVC и, вероятно, это глупый вопрос, но я не могу понять, что я делаю неправильно.MVC отправить данные с View на контроллер

У меня есть контроллер, который возвращает данные, между которыми некоторые переменные хранятся в ViewBag. С переменными, хранящимися в ViewBag, я создаю таблицу (они хранят количество строк и столбцов).

[HttpGet] 
    public ActionResult Index() 
    { 
     ViewBag.widht = someNumber1; 
     ViewBag.height = someNumber2; 
     return View(someData); 
    } 

    [HttpPost] 
    public ActionResult Index(int someNuber) 
    { 
     //calculate the new width and height using someNumber 
     ViewBag.widht = newWidth; 
     ViewBag.height = newHeight; 
     return PartialView(); 
    } 

View имеет кнопку, и когда пользователь нажимает на нее, я хочу воссоздать таблицу с различными размерами.

function OnClick_prev() { 
    @Html.ActionLink("Index", "Index", new {id = ViewBag.width+5}) 
    } 

У меня есть проблема, в том, что тело функции JavaScript выдает ошибку (видел в поджигатель), на самом деле не знаю, почему. Ошибка: SyntaxError: синтаксическая ошибка < a href = "/ Главная/Индекс/36"> Индекс

Любые советы?

+0

попробуйте обернуть свою ссылку в '' в этой функции. – Manoj

+0

Не могли бы вы показать нам JS, который вы используете? можем ли мы увидеть весь HTML-файл href? есть ли закрытие? – clement

+0

Что вы хотите достичь? 'Html.ActionLink' просто отображает тег' 'на странице, он не создает javascript –

ответ

3

Измените JS как ниже

function OnClick_prev() { 
    var loc = '@Url.Action("Index", "Index", new {id = (int)ViewBag.width+5})'; 
    window.location = loc; 
} 
+0

Это не будет иметь никакого значения. – James

+0

Вы попробовали это? Это перенаправит конкретное действие, но вы создали ссылку на действие, т. Е. Тег привязки, который является неправильным. Но это работает, как вы просили. – Aravindan

+0

Я не пробовал, но проблема все та же, 'ViewBag.width + 5' не будет компилироваться. – James

1

Проблема состоит в основном типе ViewBag является ExpandoObject, ExpandoObject эффективно Dictionary<string, object>, поэтому ViewBag.width+5 является эквивалентом

object + int 

, который не будет компилировать. Вам нужно будет отдать свой width недвижимость int, прежде чем выполнить расчет

{ id = ((int)ViewBag.width + 5) } 
0

EDIT: просто понял, что мой первоначальный ответ не работал бы потому, что вы используете POST.

изменить метод GET для этого

[HttpGet] 
public ActionResult Index(int id) 
{ 
    // Do some check on id to see if it has a value then add your old POST code here 
    ViewBag.widht = someNumber1; 
    ViewBag.height = someNumber2; 
    return View(someData); 
} 

MVC имеет по умолчанию маршрут

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

поэтому вы не должны пройти идентификатор к методу в качестве дополнительного

Затем в просмотреть сменить свой код на

@Html.ActionLink("Index", "Index", new {id= (int)ViewBag.width+5}) 
Смежные вопросы