简体   繁体   中英

Lose MongoDB ObjectId value when passing through Actions

In my MVC Controller , I have this code (after adding an object, I redirect user to edit that object):

    [PrivilegeRequirement("DB_ADMIN")]
    public ActionResult Add()
    {
        MongoDataContext dc = new MongoDataContext();

        var model = new ModelObj();
        dc.Models.Insert(model);

        return this.RedirectToAction("Edit", new { pId = model.Id, });
    }

    [PrivilegeRequirement("DB_ADMIN")]
    public ActionResult Edit(ObjectId? pId)
    {
        MongoDataContext dc = new MongoDataContext();

        var model = dc.Models.FindOneById(pId);
        if (model == null)
        {
            Session["error"] = "No model with this ID found.";
            return this.RedirectToAction("");
        }

        return this.View(model);
    }

However, pId is always null, making the FindOneById always return null. I have debugged and made sure that the Id had value when passing from Add Action. Moreover, I tried adding a testing parameter:

    [PrivilegeRequirement("DB_ADMIN")]
    public ActionResult Add()
    {
        MongoDataContext dc = new MongoDataContext();

        var model = new ModelObj();
        dc.Models.Insert(model);

        return this.RedirectToAction("Edit", new { pId = model.Id, test = 10 });
    }

    [PrivilegeRequirement("DB_ADMIN")]
    public ActionResult Edit(ObjectId? pId, int? test)
    {
        MongoDataContext dc = new MongoDataContext();

        var model = dc.Models.FindOneById(pId);
        if (model == null)
        {
            Session["error"] = "No model with this ID found.";
            return this.RedirectToAction("");
        }

        return this.View(model);
    }

When I debug, I received the test parameter in Edit Action with value of 10 correctly, but pId is null. Please tell me what I did wrong, and how to solve this problem?

I would suspect that the ObjectId is not serializing/deserializing correctly. Given that it doesn't make for a great WebAPI anyway, I generally use a string and convert within the method to an ObjectId via the Parse method (or use TryParse ):

public ActionResult Edit(string id, int? test)
{
    // might need some error handling here .... :)
    var oId = ObjectId.Parse(id);

}

You can use ToString on the ObjectId to convert it to a string for calling:

var pId = model.Id.ToString();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM