我想提供不同的视图,这些视图根据Action使用不同的ViewModel对象。这可以在常规的ASP.NET MVC范例中实现。

[HttpGet]
public ActionResult Create() {
    return View(new CreateViewModel()); //this serves Create.cshtml View
}

[HttpGet, ActionName("Create")]
public ActionResult CreatePOST(CreateViewModel viewModel) {
    if (!ModelState.IsValid) {
        return View(viewModel); //if error, re-serve Create.cshtml View
    }

    // Create new model into database

    return RedirectToAction("Index");
}

[HttpGet]
public ActionResult Edit(int Id) {
    var model = RetriveModel(Id);
    var viewModel = new EditViewModel { Id = model.Id, Name = model.Name };
    return View(viewModel); //this serves Edit.cshtml
}

[HttpPost, ActionName("Edit")]
public ActionResult EditPOST(EditViewModel viewModel) {
    if (!ModelState.IsValid) {
        return View(viewModel); //if error, re-serve Edit.cshtml View
    }

    // Update model in database

    return RedirectToAction("Index");
}


如何对果园内容部分执行相同操作?似乎ContentPartDriver中可重写的Editor方法将Create和Update操作融合在一起。如何判断该方法是创建还是更新?就像是

// GET
protected override DriverResult Editor(CustomContentPart part, dynamic shapeHelper) {
    if (IsNewRecord) {
        return ContentShape("Parts_CustomContentPart_Create" () =>
            shapeHelper.EditorTemplate(TemplateName: "Parts/CreateTemplate", Model: new CreateViewModel(), Prefix: Prefix)
        );
    } else {
        return ContentShape("Parts_CustomContentPart_Edit" () =>
            shapeHelper.EditorTemplate(TemplateName: "Parts/EditTemplate", Model: BuildEditViewModel(part), Prefix: Prefix)
        );
    }
}

// POST
protected override DriverResult Editor(CustomContentPart part, IUpdateModel updater, dynamic shapeHelper) {
    object viewModel;
    if (IsNewRecord) {
        viewModel = new CreateViewModel();
    } else {
        viewModel = new EditViewModel();
    }

    update.TryUpdateModel(viewModel, Prefix, null, null);
    return Editor(part, shapeHelper);
}


我是Orchard的初学者,仍然在学习Orchard的工作方式。如果我的问题太琐碎,请原谅我。

最佳答案

检查内容项ID,如果为null,或者可能为0(我忘记了),那么您正在创建内容项。如果它确实有值,那么您正在编辑。您也可以在自己的视图中使用它,非常方便。

如果需要在创建/更新时调用自定义功能,则可以考虑使用处理程序方法?

因此,在零件处理程序中添加类似

OnCreated<MyPart>((ctx, part) => CreateItems(part));


其中CreateItems是将您的零件作为参数的方法。您可以加入许多内容项事件,文档中有一个简洁的列表:http://docs.orchardproject.net/Documentation/Understanding-content-handlers

与往常一样,检查源代码以获取有关其用法的良好示例。

编辑

显然检查null id无效,我检查了一些我使用过的模块,并使用了以下检查:

Model.ContentItem.VersionRecord == null || !Model.ContentItem.VersionRecord.Published

关于c# - 在Orchard CMS的Content Part Driver中从更新中区分创建,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21746618/

10-11 22:29
查看更多