0

我有一个“问题”对象的控制器;如果这些问题属于“MultipleChoice”类型,那么我希望能够将“MultipleChoiceOption”对象的集合添加到问题中......到目前为止,一切都很好。

我遇到的问题是,当我编辑一个问题时,将其类型更改为 MultipleChoice,然后添加选项,必须返回编辑问题视图并提交编辑的问题,否则 Question.Type 中的更改将丢失。显然这有点烦人,所以我想做的是连接一个方法,只要下拉列表值发生更改,就会在 QuestionController 中触发相关方法。

我的编辑问题视图中有以下内容:

@Html.DropDownListFor(model => model.Type, Helper.GetSelectList(), new { id = "QuestionTypeDropDown", onchange = "OnChange();" })

<script type="text/javascript">


function OnChange(text) {
    ...do something here

        }

    }
</script>

我的问题控制器中的这个方法:

[HttpPost]
    public ActionResult QuestionTypeEdited(Question question)
    {
        if (ModelState.IsValid)
        {
            SaveQuestion(question, false);
            return RedirectToAction("Edit", "Question", new { id = question.OwningPulseId });
        }
        return View(question);
    }

但我不知道如何将它们连接起来。我尝试了一种使用我在网上找到的 Ajax 的方法,但这只是阻止了 js 的触发(也许我没有 Ajax?抱歉,我对 Ajax 一无所知,所以这可能是一个愚蠢的说法!)。是否可以使用“简单”Javascript?

如果我需要明确指定控制器,请务必提及如果您知道 :-)

干杯

4

2 回答 2

1

这是您可以做什么的一个非常基本的示例。(未经测试)

的JavaScript:

// wire up your change event unobtrusively with jQuery
$("#Type").change(function() {
  // find the form that the select belongs to and serialize it
  var question = $(this).closest("form").serialize();
  // POST the form data to your controller
  $.post("Question/QuestionTypeEdited", question, function(data) {
      // this function executes when the POST completes
      // if data has a RedirectUrl, redirect
      if (data.RedirectUrl)
      {
         window.location = data.RedirectUrl;
      }
      else
      {
         // display any errors - I'm using alert because its very simple, you'll probably want to use a div
         alert(data.Errors);
      }
  });
});

这是动作:

[HttpPost]
public ActionResult QuestionTypeEdited(Question question)
{
    if (ModelState.IsValid)
    {
        SaveQuestion(question, false);

        // return a JSON result with a redirect url
        return Json(new {RedirectUrl = "Edit/Question/"+question.OwningPulseId});
    }

    // return a JSON result with the errors
    return Json(new {Errors = ModelState.Errors});
}

参考:

于 2012-10-12T13:00:27.567 回答
0

如果您只想在 ddl 更改时将回发到您的控制器,您可以这样做:

<script type="text/javascript">

function OnChange() {
    document.forms[0].submit();

    }
</script>

假设您在一个表格中:

@using (Html.BeginForm())

您将从 DropDownListFor 获取值到 [HttpPost] 控制器

于 2012-10-12T13:13:23.703 回答