ASP.NET MVC 3(Razor)表单提交不起作用

时间:2012-05-25 10:06:05

标签: asp.net-mvc-3 razor

使用Fiddler我可以看到请求甚至没有被发出但是我看不出原因。

以下是表格:

@using (Html.BeginForm("Index", "FileSystemChannelIndex", FormMethod.Post, new {
channelId = @Model.ChannelId }))
{
    @Html.HiddenFor(model => model.Id)
    @Html.HiddenFor(model => model.ChannelId)
    <div class="editor-label">
        Select File Source
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(
            model => model.SelectedFileSourceValue,
            new SelectList(Model.AvailableFilesSources, "Id", "Name"),
            new { id = "selectFileSource" })
    </div>
    <p>
        <input class="t-button" type="submit" value="Save" />
    </p>
}

View最初来自:

public ViewResult Create(int channelId)
{   
    var channel = this.fullUOW.GetFileSystemChannelRepository().All.Where(c => c.Id == channelId);
    var vm = new FileSystemChannelIndexViewModel(channelId, new FileSystemChannelIndex());
    return View("Edit", vm);
}

我已经尝试将“name”属性添加到但是没有任何区别。

有什么想法吗?

编辑: Jim等人的更多信息......

域:

public class FileSystemChannel
{
   public int Id {get; set; }
   public ICollection<FileSystemChannelIndex> ChannelIndexes { get; set; }
}

public class FileSystemChannelIndex
{
   public int Id { get; set; }
   public FileSystemChannel ParentChannel { get; set; }
}

由于0 ... *关联,在UI中我们必须首先创建FileSystemChannel,然后向其添加FileSystemChannelIndex。这就是我将channelId传递给FileSystemChannelIndex创建视图的原因。提交新的FileSystemChannelIndex时,应调用以下操作:

[HttpPost]
public ActionResult Index(int channelId, FileSystemChannelIndexViewModel vm)
{
    //TODO: get the Channel, add the Index, save to db

    return View("Index");
}

3 个答案:

答案 0 :(得分:3)

感谢Mark的评论,这是由于选择了失败的客户端验证。使用IE开发工具检查元素:

<select name="SelectedFileSourceValue" class="input-validation-error" id="selectFileSource" data-val-required="The SelectedFileSourceValue field is required." data-val-number="The field SelectedFileSourceValue must be a number." data-val="true">

答案 1 :(得分:1)

EMPO,

继上面的评论:

empo - 您可以将public ActionResult Create(////)方法(即HttpPostHttpGet)发布到问题中,因为这可以突出显示问题是否与模糊方法签名相关,我怀疑很可能是因为你回复了与HttpGet actionresult相同的签名

尝试添加适当的HttpPost动作结果:

[HttpPost]
public ActionResult Create(FileSystemChannelIndex domainModel)
{
    if (!ModelState.IsValid)
    {
        return View(PopulateEditViewModel(domainModel));
    }

    _serviceTasks.Insert(domainModel);
    _serviceTasks.SaveChanges();
    return this.RedirectToAction("Edit", new {id = domainModel.ChannelId});
}

你原来的HttpGet(对我来说感觉'奇怪'):

[HttpGet]
public ViewResult Create(int channelId) {   
    var channel = this.fullUOW.GetFileSystemChannelRepository().All
       .Where(c => c.Id == channelId);
    var vm = new FileSystemChannelIndexViewModel(channelId, 
        new FileSystemChannelIndex());
    return View("Edit", vm); 
}

并在Edit actionresult中,您将根据传入的ID获取实体。可能会工作,可能不会。如果没有更全面的域名和逻辑图片,我们不确定。

显然,你自己的管道会有所不同,但这应该让我们知道应该预期的内容。

答案 2 :(得分:0)

你在创造什么东西时怎么能有Model.Id?也许Model.Id为null,因为你无法发布