0

使用 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>
}

视图最初来自:

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);
}

我尝试将“名称”属性添加到,但这没有任何区别。

有任何想法吗?

编辑:吉姆等人的更多信息......

领域:

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");
}
4

3 回答 3

3

因此,感谢 Mark 的评论,这是由于 Select 客户端验证失败。使用 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">
于 2012-05-25T13:35:45.007 回答
1

恩波,

除了我上面的评论:

empo - 您能否将这两种public ActionResult Create(////)方法(即HttpPostHttpGet)都发布到问题中,因为这可能会突出问题是否与不明确的方法签名有关,我怀疑这很可能是因为您发回与 HttpGet actionresult 相同的签名

尝试按照以下方式添加适当的 HttpPost actionresult:

[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 获取实体。可能会工作,可能不会。如果没有更全面地了解您的领域和逻辑,则不确定。

显然,您自己的管道会有所不同,但这应该可以让您了解预期的结果。

于 2012-05-25T10:31:28.387 回答
0

创建东西时如何拥有 Model.Id ?也许 Model.Id 为空,因为您无法发布

于 2012-05-25T11:10:26.080 回答